解析同一接口的两个实例

时间:2014-06-01 18:47:51

标签: 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));
        }   
    }
}

现在,我想使用容器来解决依赖关系。我试过这个:

static void Main(string[] args)
{
    var container = new UnityContainer();

    container.RegisterType<ILog, DatabaseLogger>();
    container.RegisterType<ILog, FileLogger>();

    var dependant = container.Resolve<Dependant>();
}

但是当使用两个FileLogger实例解析Dependent时。我试图给注册命名,以匹配构造函数使用的名称但是没有用。

3 个答案:

答案 0 :(得分:3)

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

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>();

如果省略命名,例如

,您也可以将数据库记录器注册为默认值
container.RegisterType<ILog, DatabaseLogger>();
container.RegisterType<ILog, FileLogger>("fileLogger");

在这种情况下,解析 ILog 会使用您的 DatabaseLogger 。因此,无需根据需要定义更多接口。

修改

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

答案 1 :(得分:2)

为每个界面创建一个单独的界面 - 因为您无论如何都要在应用程序中单独使用它们。如果您需要以多态方式使用它们,它们都可以继承ILog,但只需创建两个不同的接口就可以让Unity为您的构造函数解析它们。

public interface IDatabaseLog: ILog
{
}

public interface IFileLog: ILog
{
}

public class DatabaseLogger: IDatabaseLog
{
}

public class FileLogger: IFileLog
{

}

public Dependant(IDatabaseLog dbLog, IFileLog fsLog)
{
 //useful code
}

答案 2 :(得分:0)

更改构造函数,以便您改为使用数组:

class Dependant
{
    public Dependant(ILog[] logs)
    {
        foreach (var i in Enumerable.Range(1, 15))
        {
            foreach (var log in logs)
                log.Log(string.Format("{0} - going to FS", i));
        }   
    }
}