C# 在简单注入器中注册期间设置收集项目的生活方式
似乎C# 在简单注入器中注册期间设置收集项目的生活方式,c#,.net,dependency-injection,ioc-container,simple-injector,C#,.net,Dependency Injection,Ioc Container,Simple Injector,似乎Container.Collection.Register没有采用生活方式的重载。所有发现的实现都将注册到默认的生活方式。遗漏这一超负荷的原因是什么 添加集合的首选方式是什么?在集合中,所有项目都应具有不是默认生活方式的生活方式 遗漏这一超负荷的原因是什么 首先,因为(作为): 从来没有人设计、指定、实施、测试、记录和发布过该功能。所有这六件事都是实现功能所必需的。所有这些都很贵 其次,Collection.Register重载接受Type实例列表(例如Collection.Register
Container.Collection.Register
没有采用生活方式的重载。所有发现的实现都将注册到默认的生活方式。遗漏这一超负荷的原因是什么
添加集合的首选方式是什么?在集合中,所有项目都应具有不是默认生活方式的生活方式
遗漏这一超负荷的原因是什么
首先,因为(作为):
从来没有人设计、指定、实施、测试、记录和发布过该功能。所有这六件事都是实现功能所必需的。所有这些都很贵
其次,Collection.Register
重载接受Type
实例列表(例如Collection.Register(params Type[])
),接受实现和抽象的列表。为抽象提供生活方式
没有多大意义,甚至令人困惑
要了解Simple Injector允许提供抽象的原因,请查看以下注册:
container.Collection.Register(
类型(ILogger),
类型(IsSpecialLogger),
类型(SqlLogger));
容器。寄存器(生活方式。范围);
容器。登记(生活方式。单身);
在本例中,注册了一个记录器集合,其中提供的两个类型是抽象。允许提供抽象的想法是,使用它,您可以将它们指向其他注册。这正是前面的示例所做的。在解析记录器集合时,它将包括作用域
默认记录器
,单例
特殊记录器
,以及瞬态
SqlLogger
现在考虑假设的新<代码>集合。登记< <代码>过载,接受<代码>生活方式<代码>:
container.Collection.Register(新[]
{
类型(ILogger),
类型(IsSpecialLogger),
类型(SqlLogger)
},
生活方式(短暂的);
容器。寄存器(生活方式。范围);
容器。登记(生活方式。单身);
所有元素都是暂时的,而其中两个元素指向不同生活方式的注册,这意味着什么
我们还没有找到一个好的API来解决这些问题,这就是为什么容器缺少这种重载
添加一个集合的首选方式是什么?在该集合中,所有项目都应该有一种不是默认生活方式的生活方式
有多种方法可以做到这一点
选项1:显式注册元素
在Simple Injector中注册的集合使用回退机制来确定其生活方式。这是通过检查集合元素是否存在具体注册来实现的。例如:
container.Collection.Register(typeof(SqlLogger),typeof(FileLogger));
//当作为IEnumerable的一部分时,确保SqlLogger是单例的。
容器。登记(生活方式。单身);
当通过简单喷油器首次解析IEnumerable
时,对于每个元件,它将(按以下顺序):
- 尝试获得明确注册的具体注册(在示例中:
Register
- 尝试使用未注册的类型解析获取该注册
- 尝试在使用已配置的
容器.Options.LifestyleSelectionBehavior
(默认为Transient
)的同时创建注册本身
选项2:使用寄存器(类型,IEnumerable)重载
除了向Collection.Register
提供类型或程序集列表外,您还可以提供registation
实例列表。registation
描述为特定生活方式创建特定组件,当您调用Container.Register时,该类通过简单的内部注入来使用
或容器.Collection.Register
。但您也可以手动创建注册
实例,并将其提供给集合。注册
重载如下:
//加载类型列表而不注册它们
Type[]types=container.getTypeStoreRegister(程序集);
//使用接收注册列表的重载来注册它们
容器集合寄存器(
从输入类型
选择Lifestyle.Transient.CreateRegistration(类型,容器));
这将强制所有已注册的收藏类型都具有Transient
生活方式。如果需要,您还可以为每种类型提供自己特定的生活方式
选项3:覆盖生活方式选择行为
当找不到注册时,Collection.Register
使用配置的LifestyleSelectionBehavior
在最后一分钟进行注册。默认选择行为始终返回Lifestyle.Transient
,但此行为可以更改。例如:
class CustomLifestyleSelectionBehavior:ILifestyleSelectionBehavior
{
公共生活方式选择生活方式(类型实施类型)=>
implementationType==typeof(SqlLogger)
?生活方式。单身
:短暂的生活方式;
}
显然,此实现有点幼稚,但它展示了这一概念。您可以按如下方式覆盖默认行为:
container.Options.LifestyleSelectionBehavior=
新的CustomLifestyleSelectionBehavior();
选项4:追加
在允许一次性注册所有元素的Collection.Register
旁边,您可以使用Collection.Append
方法。它们允许逐个注册集合元素:
container.Collection.Append(lifety.Singleton);
container.Collection.Append(livelity.Transi