我正在使用 Simple Injector,但也许我需要的是更多概念性的答案。
这是交易,假设我的应用程序设置有一个界面:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
然后,通常会有一个实现 IApplicationSettings 的类,从指定的源获取每个字段,例如:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
然而!假设我想EnableLogging
从 app.config、CopyLocal
数据库和ServerName
另一个获取当前计算机名称的实现中获取。我希望能够混合匹配我的应用程序配置,而不必创建 9 个实现,每个组合一个。
我假设我不能传递任何参数,因为接口是由注入器(容器)解析的。
我一开始是这么想的:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{
TEnableLogging EnableLog{get;}
TCopyLocal CopyLocal{get;}
TServerName ServerName{get;}
}
public class ApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Container.GetInstance<TEnableLogging>().Value
}
return enableLogging;
}
}
}
但是,有了这个我有一个主要问题:我怎么知道如何创建一个TEnableLogging
(它是 a IGetValue<bool>
)的实例?哦,假设这IGetValue<bool>
是一个具有 Value 属性的接口,它将由具体类实现。但是具体的类可能需要一些细节(比如 app.config 中的键名是什么)或不需要(我可能只是想始终返回 true)。
我对依赖注入比较陌生,所以也许我的想法是错误的。有没有人对如何做到这一点有任何想法?
(你可以用另一个 DI 库来回答,我不介意。我想我只需要抓住它的概念。)