首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity Factory注入

Unity Factory注入
EN

Stack Overflow用户
提问于 2012-12-07 02:02:08
回答 2查看 11.7K关注 0票数 4

我有一个类似下面的接口,我将其注入到unity容器中。

代码语言:javascript
复制
public interface IMyInstanceFactory
{
    IEnumerable<IMyInstance> GetAll();
}

所有IMyInstance在运行前都是已知的,即它们可以在引导程序中设置,并且可以从unity中检索。我对IMyInstanceFactory的具体实现如下:

代码语言:javascript
复制
public class MyInstanceFactory:IMyInstanceFactory
{
    IUnityContainer _container;

    public MyInstanceFactory(IUnityContainer container)
    {
        _container = container;
    }
    public IEnumerable<IMyInstance> GetAll()
    {
        return _container.ResolveAll<IMyInstance>();
    }
}

..and在我的bootstrapper中,我会这样做:

代码语言:javascript
复制
container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;

这很好地解决了所有问题。然而,我不想依赖于容器本身,或者仅仅为了这个而实现IMyInstanceFactory,有没有一种方法可以在不实现IMyInstanceFactory的情况下设置它?Unity是否为此提供了工具?

像这样的东西..

代码语言:javascript
复制
container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);

我知道castle可以做到这一点,Unity也能做到类似的事情吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-07 04:42:19

这就是a port of the Castle Windsor Typed Factory Facilities for Unity。它将生成您的接口的实现并为您执行ResolveAll

您的引导代码应该如下所示:

代码语言:javascript
复制
container.RegisterType<IMyInstance,MyInstance1>("1");
container.RegisterType<IMyInstance,MyInstance2>("2");
container.RegisterType<IMyInstance,MyInstance3>("3");
container.RegisterType<IMyInstanceFactory>(new TypedFactory());

GetAll的调用将被转换为容器调用ResolveAll

该端口遵循为Windsor描述的相同约定。

票数 3
EN

Stack Overflow用户

发布于 2012-12-07 02:50:34

将容器传递给工厂没有什么错,如果工厂被公开为单例,这样获取实例就不需要再次传递容器,这就很有效。

另一种选择是在工厂中使用服务定位器解析容器,因为定位器是单例的,这种方法类似于前者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13749706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档