Mik*_*ike 5 c# castle unity-container
我有一个如下所示的接口,我将其注入到统一容器中。
public interface IMyInstanceFactory
{
IEnumerable<IMyInstance> GetAll();
}
Run Code Online (Sandbox Code Playgroud)
所有这些IMyInstance在运行时之前都是已知的,即它们可以在引导程序中设置,并且可以从统一中检索。我的具体实现IMyInstanceFactory如下:
public class MyInstanceFactory:IMyInstanceFactory
{
IUnityContainer _container;
public MyInstanceFactory(IUnityContainer container)
{
_container = container;
}
public IEnumerable<IMyInstance> GetAll()
{
return _container.ResolveAll<IMyInstance>();
}
}
Run Code Online (Sandbox Code Playgroud)
..在我的引导程序中我做了这样的事情:
container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;
Run Code Online (Sandbox Code Playgroud)
这一切都完美地解决了。但是,我不想依赖容器本身或IMyInstanceFactory为此实现,有没有办法可以在不实现的情况下进行设置IMyInstanceFactory?Unity 是否为此提供了便利?
诸如此类的东西..
container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);
Run Code Online (Sandbox Code Playgroud)
我知道 castle 可以做到这一点,Unity 可以做类似的事情吗?
有一个用于 Unity 的温莎城堡类型工厂设施的端口。它将生成您的接口的实现并ResolveAll为您执行此操作。
您的引导代码应该如下所示:
container.RegisterType<IMyInstance,MyInstance1>("1");
container.RegisterType<IMyInstance,MyInstance2>("2");
container.RegisterType<IMyInstance,MyInstance3>("3");
container.RegisterType<IMyInstanceFactory>(new TypedFactory());
Run Code Online (Sandbox Code Playgroud)
对 的调用GetAll将被转换为容器调用ResolveAll。
该端口遵循与 Windsor 相同的约定。
| 归档时间: |
|
| 查看次数: |
12327 次 |
| 最近记录: |