我需要使用配置文件来做到这一点。这实际上很容易,但我花了一段时间才弄清楚。
在这个例子中,我们有一个接口IRepository<T>
,它有 2 个实现:
OneRepository
TwoRepository
然后我们有一个名为的类Worker
,它依赖于IRepository<One>
and IRepository<Two>
。我们要求 unity 为我们创建一个实例,Worker
并从配置文件中找出依赖关系。
接口和实现
ConsoleApplication1
在这个例子中,所有这些都在命名空间中。
public class Worker
{
private readonly IRepository<One> one;
private readonly IRepository<Two> two;
public Worker(IRepository<One> one, IRepository<Two> two)
{
this.one = one;
this.two = two;
}
public string DoOne()
{
return this.one.Add(new One());
}
public string DoTwo()
{
return this.two.Add(new Two());
}
}
public interface IRepository<T>
{
string Add(T t);
}
public class OneRepository : IRepository<One>
{
public string Add(One t)
{
return "One";
}
}
public class TwoRepository : IRepository<Two>
{
public string Add(Two t)
{
return "Two";
}
}
public class One { }
public class Two { }
统一配置
请注意我们指示统一并告诉它程序集的名称。然后我们注册这 2 个实现。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="ConsoleApplication1" />
<container>
<register type="ConsoleApplication1.IRepository[[ConsoleApplication1.One]]" mapTo="ConsoleApplication1.OneRepository" />
<register type="ConsoleApplication1.IRepository[[ConsoleApplication1.Two]]" mapTo="ConsoleApplication1.TwoRepository" />
</container>
</unity>
</configuration>
应用
这是组合根。
public class Program
{
static void Main()
{
UnityContainer container = new UnityContainer();
var res = container.LoadConfiguration();
Worker worker = res.Resolve<Worker>();
Console.WriteLine(worker.DoOne());
Console.WriteLine(worker.DoTwo());
Console.Read();
}
}
预期的输出是:
One
Two