MSDN上有一个示例Deferring the Resolution of Objects
// Create a Unity container
IUnityContainer myContainer = new UnityContainer();
// Create an IEnumerable resolver for the IMyClass interface type
var resolver = myContainer.Resolve<Func<IEnumerable<IMyClass>>>();
// ... other code here...
// Register mappings for the IMyClass interface to appropriate concrete types
myContainer.RegisterType<IMyClass, FirstClass>("First");
myContainer.RegisterType<IMyClass, SecondClass>("Second");
myContainer.RegisterType<IMyClass, ThidClass>("Third");
// Resolve a collection of the mapped target objects
IEnumerable<IMyClass> myClassInstances = resolver();
我有点鼓舞并试图完成下面的事情。
我的界面和具体类是:
public interface IImplementMe
{
void DoSomething();
}
public class FirstImplementation : IImplementMe
{
public void DoSomething()
{
Console.WriteLine("First");
}
}
public class SecondImplementation : IImplementMe
{
public void DoSomething()
{
Console.WriteLine("Second");
}
}
我的服务类是这样的:
public class Service
{
private bool someCondition;
Func<Dictionary<string, IImplementMe>> myClassInstances;
public Service(Func<Dictionary<string, IImplementMe>> myClassInstances)
{
this.myClassInstances = myClassInstances;
}
public void Foo()
{
if (someCondition)
{
myClassInstances.Invoke()["First"].DoSomething();
}
else
{
myClassInstances.Invoke()["Second"].DoSomething();
}
}
}
您可以理解,我正在尝试注册接口的多个实例,并且应该在运行时按需使用正确的实例。
我应该如何注册我的类型,以便我可以通过给别名在我的服务类中使用它们。
我知道我可以通过使用别名注册它们并通过给予别名来解决它们。但我不想在我的服务类中引用Unity。
或许有一种更明智的方法可以做到这一点。
答案 0 :(得分:1)
该文档适用于Unity2。如果您使用的是Unity3.x,则应使用Lazy<T>
代替Func<T>
here。我会问为什么你需要使用延迟解决方案,因为对象的构造实际上应该可以忽略性能(如果不是,那么这是代码气味,因为在构造函数中完成了太多的工作)。
如果没有Unity的引用,您的Foo
已解析的实例将不知道集合项的注册名称。但您可以通过其他方式区分集合中的项目。您可以在IImplementMe上创建字符串Name属性。或者您可以获得已解决项目的类型。
答案 1 :(得分:0)
最后,我可以想出一些事情。
谢谢Tyler ..
printout()