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