use*_*457 3 c# dependency-injection unity-container
如果我有两个具有相同接口的类,以及一个采用它的两个不同版本的构造函数 - 如何使用 Unity 容器来解决依赖关系?
这是一个简单的测试:
class Dependant
{
public Dependant(ILog dbLog, ILog fsLog)
{
foreach (var i in Enumerable.Range(1, 15))
{
if (i%3 == 0)
dbLog.Log(string.Format("{0} - going to DB", i));
else
fsLog.Log(string.Format("{0} - going to FS", i));
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想使用容器来解决依赖关系。我试过这个:
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<ILog, DatabaseLogger>();
container.RegisterType<ILog, FileLogger>();
var dependant = container.Resolve<Dependant>();
}
Run Code Online (Sandbox Code Playgroud)
但是当使用 FileLogger 的两个实例解析 Dependent 时。我尝试为注册提供名称,以匹配构造函数使用的名称,但这不起作用。
您可以使用命名组件注册/解析同一接口的两个实现。对于您的示例,它看起来类似于以下内容
var container = new UnityContainer();
container.RegisterType<ILog, DatabaseLogger>("databaseLogger");
container.RegisterType<ILog, FileLogger>("fileLogger");
container.RegisterType<Dependant>(new InjectionConstructor(
new ResolvedParameter<ILog>("databaseLogger"),
new ResolvedParameter<ILog>("fileLogger")));
var dependant = container.Resolve<Dependant>();
Run Code Online (Sandbox Code Playgroud)
如果您省略命名,您还可以将数据库记录器注册为默认值,fe
container.RegisterType<ILog, DatabaseLogger>();
container.RegisterType<ILog, FileLogger>("fileLogger");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,解析ILog将使用您的DatabaseLogger。所以没有必要根据需要定义更多的接口。
编辑
我修改了上面的代码片段,因为我认为它更适合您的需求。