Simple Injector的工厂设施

时间:2015-06-27 18:26:47

标签: c# asp.net .net simple-injector

我正在从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;
}

1 个答案:

答案 0 :(得分:4)

Castle的工厂设施能够根据您提供的界面生成代理类。此代理类将回调到容器中以请求创建此类型的新实例。

Simple Injector缺乏这样的功能。 Simple Injector并没有实现这一点,因为:

  • 您的应用程序代码所需的工厂数量应该相当有限(最多只有几个)。 精心设计的应用程序几乎不需要工厂。
  • 使用手写工厂实现这一目标非常容易。
  • 手写工厂应该是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 });