【发布时间】:2020-06-23 21:06:38
【问题描述】:
我在项目中使用 Simple Injector 作为 DI 容器。
问题是我有一个SqliteStorage-class,它需要数据库的路径。有多个 db,所以我需要一种方法来在创建时注入 SqliteStorage-class 的路径。
我的代码如下(简化后没有接口):
public class SqliteStorageOptions
{
public string Path {get; set;}
}
public class SqliteStorage
{
private readonly string _path;
public SqliteStorage(SqliteStorageOptions options)
{
_path = options.Path;
}
}
public class Db1
{
private readonly SqliteStorage _sqlite;
public Db1(SqliteStorage sqlite)
{
_sqlite = sqlite;
}
}
public class Db2
{
private readonly SqliteStorage _sqlite;
public Db1(SqliteStorage sqlite)
{
_sqlite = sqlite;
}
}
// without di
var db1 = new Db1(new SqliteStorage(new SqliteStorageOptions { Path = "db1.db" });
var db2 = new Db2(new SqliteStorage(new SqliteStorageOptions { Path = "db2.db" });
可能的解决方案:
- 在
SqliteStorage的每个方法中包含SqliteStorageOptions作为参数。 - 在
SqliteStorage中提供一个init方法 - 使用
public SqliteStorage Create(SqliteStorageOptions options)方法创建SqliteStorageFactory。
那么对于我在 simple-injector 中的问题是否有任何内置解决方案,或者有人可以提供另一种(更好的)解决方案吗?
谢谢
编辑 1:
我添加了一些代码。 Db1 和 Db2 都连接到 sqlite-dbs(不同的 dbs,不同的模式),所以我想将所有 sqlite-stuff 提取到它自己的类 SqliteStorage。所以,SqliteStorage 需要知道 db 路径。
【问题讨论】:
-
您显示的代码有什么问题?不确定我是否理解您要解决的问题。
-
DI框架应该如何知道注入哪条路径?如果这可以根据 DI 框架中可用的其他服务提供的值来确定,那么您应该能够为
SqliteStorageOptions注册一个工厂方法,并且一切都会“正常工作”。如果不是,则 DI 容器无法知道要注入什么,因此您需要使用您提到的一种可能的解决方案(我建议 #1 或 #3)。 -
您有多个数据库,但它们都具有相同的架构还是不同的架构?这是一个对回答您的问题很重要的区别。
-
我添加了一些代码。 @StriplingWarrior
Db1, Db2知道他们的路径。 @Steven 不同的数据库,不同的架构。SqliteStorage是对 sqlite-stuff 的抽象。
标签: c# dependency-injection simple-injector