解析同一接口的两个实例

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 时。我尝试为注册提供名称,以匹配构造函数使用的名称,但这不起作用。

Hor*_*Net 5

您可以使用命名组件注册/解析同一接口的两个实现。对于您的示例,它看起来类似于以下内容

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。所以没有必要根据需要定义更多的接口。

编辑

我修改了上面的代码片段,因为我认为它更适合您的需求。