Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在简易注射器容器中注册一次性混凝土类型_C#_Idisposable_Simple Injector - Fatal编程技术网

C# 如何在简易注射器容器中注册一次性混凝土类型

C# 如何在简易注射器容器中注册一次性混凝土类型,c#,idisposable,simple-injector,C#,Idisposable,Simple Injector,我在上找到了以下代码 公共静态无效寄存器disposabletransient( 这个集装箱(集装箱) 其中:类、IDisposable、TService where-TService:class { var scoped=生活方式。scoped; var reg=lifety.Transient.CreateRegistration( 容器); 注册SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "压

我在上找到了以下代码

公共静态无效寄存器disposabletransient(
这个集装箱(集装箱)
其中:类、IDisposable、TService
where-TService:class
{
var scoped=生活方式。scoped;
var reg=lifety.Transient.CreateRegistration(
容器);
注册SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent,
"压抑";;
容器。添加注册(类型(TService),注册号);
container.RegisterInitializer(
o=>scoped.RegisterForDisposal(容器,o));
}

我想注册一个具体的实现(一个不实现任何特定接口的实现),该实现可用于瞬态范围。如果您想注册一个具体的一次性类型,我需要对上面的代码做哪些更改,通常最简单(也是最好)的方法是将其注册为范围

container.Register<MyConcrete>(Lifestyle.Scoped);
container.Register(lifesture.Scoped);
如果您真的需要该实例是暂时的(不太可能),您必须执行以下操作

只需使用
CreateRegistration
重载即可:

public static void RegisterDisposableTransient<TConcrete>(this Container container)
    where TConcrete : class, IDisposable
{
    var scoped = Lifestyle.Scoped;
    var reg = Lifestyle.Transient.CreateRegistration<TConcrete>(container);

    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "suppres");

    container.AddRegistration(typeof(TConcrete), reg);
    container.RegisterInitializer<TConcrete>(
        o => scoped.RegisterForDisposal(container, o));
}
公共静态无效注册表DisposableTransient(此容器)
其中t混凝土:类,IDisposable
{
var scoped=生活方式。scoped;
var reg=lifety.Transient.CreateRegistration(容器);
注册SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent,“Suppress”);
容器。添加注册(类型(T混凝土),注册);
container.RegisterInitializer(
o=>scoped.RegisterForDisposal(容器,o));
}

最后一行(
scoped.RegisterForDisposal
)引发异常。删除最后一行可以吗?关键是,这不应该是作用域,而应该是暂时的,但是如果服务类型(tcontcrete)实现IDisposable,就会抛出。这里的想法是用户正在处理处置,这在控制台应用程序或web服务中尤其需要。另一种选择是,我们必须引用容器本身来调用etc上的BeginScope,但这需要在整个应用程序中引用容器!最大的不,不,当我们可以处理是我们自己的对象。感谢您的反馈。顺便说一句,@Steven(优秀)的文档涵盖了这个问题,但同样地,在最后一行中使用了一个范围,当我认为整个要点是它注册为一个瞬态时,即不应该有范围处理处置。整个问题通常是我们没有范围(所以最后一行抛出异常)。注册transient的目的是当我们自己处理处置时。您的设计给我提出了一些问题,因此最好发布一个新问题,解释您正在做什么,这是什么类型的一次性对象,以及应用程序如何与之交互。这让我可以给出一个更具体的答案。此外,看到抛出的异常的详细信息也很有趣。我有一些异常,所以我创建了一个helper方法,用于我的configureContainer方法:private static void registerConcreteDisposable(),其中T:class{var reg=Lifestyle.Transient.CreateRegistration(container);reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent,“suppress”);container.AddRegistration(typeof(T),reg);}