2015-06-27 93 views
2

我从Windsor迁移到Simple Injector,我试图按照以下this link。但我无法找到任何替代:简易喷油器工厂设施

container.AddFacility<TypedFactoryFacility>(); 
container.Register(Component.For<ICacheDependencyFactory>().AsFactory()); 

会是怎样的更换Simple Injector上面的代码?

编辑:

ICacheDependencyFactory.cs

public interface ICacheDependencyFactory 
{ 
    T Create<T>() 
     where T : ICacheDependency; 

    void Release<T>(T cacheDependency) 
     where T : ICacheDependency; 
} 
+0

这种联系是你所描述的相反,它是如何迁移***到*** CastleWindsor。 – Claies

+0

是的,我知道,但仍然有很多指导。 –

+0

它也过时了;它是最后编辑于2012年10月6日,并且指的是基于版本2.5.3的代码示例。 Simple Injector的当前版本是3.0.0。以前的2.x版本是2.8.1。 – Claies

回答

4

堡的工厂设施能够基于你提供的接口的代理类。此代理类将回调到容器中以请求创建此类型的新实例。

简单的喷油器缺乏这种功能。简单的喷油器不实现这一点,因为:

  • 您的应用程序代码需要的工厂数量应该相当有限(最多只能是一对)。 精心设计的应用程序几乎不需要工厂。
  • 用手写工厂实现这一点非常简单。
  • 手写工厂应该是属于你composition root(其中已经有容器上的依赖)。这可以防止应用程序代码不得不依赖于容器。

下面是一个例子:

private sealed class CacheDependencyFactory : ICacheDependencyFactory { 
    public Container Container { get; set; } 
    public T Create<T>() where T : ICacheDependency, class { 
     return this.Container.GetInstance<T>(); 
    } 
} 

这个工厂可以注册如下:

container.RegisterSingle<ICacheDependencyFactory>(
    new CacheDependencyFactory { Container = container }); 
+0

我从以下链接复制:http://geekswithblogs.net/Rhames/archive/2012/09/13/adding-sql-cache-dependencies-to-the-loosely-coupled-.net-cache.aspx ICacheDependencyFactory没有具体的类。 –

+0

你可以自己做实现。 – Steven

+1

请注意,[释放]方法在简单注射器中是多余的,如[此处]所述(https://simpleinjector.readthedocs.org/en/latest/decisions.html#never-force-release)。即使对于Windsor,我也会反对在你的工厂上使用'Release'方法,因为这意味着你正在将有关IoC库的实现细节泄漏到你的核心域中。即使有了Windsor,你也可以在不强迫你的应用程序受到这种约束的情况下做到这一点,尽管如此,Windsor还需要做更多的工作。 – Steven

相关问题