Simple Injector 工厂设施
Factory facility in 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;
}
Castle 的工厂设施能够根据您提供的接口生成代理 class。此代理 class 将回调容器以请求创建此类新实例。
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 });
我正在从 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;
}
Castle 的工厂设施能够根据您提供的接口生成代理 class。此代理 class 将回调容器以请求创建此类新实例。
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 });