如果我有两个相同接口的类,以及一个带有两个不同版本的构造函数 - 我如何使用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时。我试图给注册命名,以匹配构造函数使用的名称但是没有用。
答案 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));
}
}
}