C# 简易喷油器的工厂设备

C# 简易喷油器的工厂设备,c#,asp.net,.net,simple-injector,C#,Asp.net,.net,Simple Injector,我正在从温莎迁移到Simple Injector,我试着遵循以下步骤。但我找不到任何替代品: container.AddFacility<TypedFactoryFacility>(); container.Register(Component.For<ICacheDependencyFactory>().AsFactory()); Castle的工厂工具能够根据您提供的接口生成代理类。此代理类将回调到容器中,以请求创建此类类型的新实例 简单的喷油器没有这种特性。简单喷

我正在从温莎迁移到Simple Injector,我试着遵循以下步骤。但我找不到任何替代品:

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

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

简单的喷油器没有这种特性。简单喷油器无法实现此功能,因为:

应用程序代码所需的工厂数量应该相当有限,最多只能有几个。 设计良好的应用程序几乎不需要工厂。 用手写工厂实现这一点非常容易。 手写工厂应该是您的一部分,因为它已经依赖于容器。这可以防止应用程序代码必须依赖于容器。 下面是一个例子:

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 });

这个链接与您描述的相反,它是如何迁移到CastleWindsor。是的,我知道,但仍然有很多指导。它也过时了;最后一次编辑是2012年10月6日,参考的是基于版本2.5.3的代码示例。简单喷油器的当前版本为3.0.0。;以前的2.x版本是2.8.1。是的,这就是问题所在。我正在从以下链接复制:并且没有针对ICacheDependencyFactory的具体类。您可以自己实现。请注意,如前所述,在Simple Injector中,发布方法是多余的。即使使用Windsor,我也会反对在您的工厂中使用发布方法,因为这意味着您正在将有关IoC库的实现细节泄露到您的核心域中。即使使用Windsor,您也可以不强制应用程序执行此约束,尽管使用Windsor需要更多的工作。这是一个很大的缺点,即没有类型化工厂设施。无论集装箱有多快,如果它能完成日常工作,它都是无用的,就像一级方程式赛车一样。我想用Create方法声明一个接口,让它在不实现任何东西的情况下工作,特别是我不想直接依赖于具体的IOC。我还想声明一个接口方法,该方法可以获取用于构造特定对象的参数。@user1335696。请研究一下复合根的概念。工厂应该在合成根目录中定义。这将防止应用程序依赖于容器。
container.RegisterSingle<ICacheDependencyFactory>(
    new CacheDependencyFactory { Container = container });