gpt4 book ai didi

dependency-injection - 在 autofac 依赖注入(inject)中 InstancePerOwned 的正确用法是什么

转载 作者:行者123 更新时间:2023-12-01 23:48:06 25 4
gpt4 key购买 nike

我想知道 InstancePerOwned<TService>() 的正确用法是什么在 Autofac 中。在解决依赖关系时如何使用它?

最佳答案

考虑以下代码

public interface IAnotherService
{
int Id { get; set; }
string Lable { get; set; }
}

public class AnotherService : IAnotherService,IDisposable
{
public int Id { get; set; }
public string Lable { get; set; }


public AnotherService(/* loads of dependent components*/)
{

}

public override string ToString()
{
return string.Format("My Id is:{0} and my lable is {1}", Id, Lable);
}

public void Dispose()
{
// Another Service is Disposing ;
}
}

public interface IMyService
{
void DoSomething();
}

// MyService class depends on IAnotherService
// MyService class is a huge and long-lived class where we have just ommited lots of other implementations
public class MyService : IMyService
{
private readonly IAnotherService _anotherService;

public MyService(IAnotherService anotherService)
{
_anotherService = anotherService;
}

public Void DoSomething()
{
Console.WriteLine(_anotherService.ToString());
}

//
//
//
// The rest of the class
//
//
//
//
}

在上面的代码中,MyService 类依赖于 IAnotherService。所以在你的依赖注册中你会以某种方式说

 builder.RegisterType<AnotherService>().As<IAnotherService>().InstancePerDependency();


这确保了任何时候使用 Autofac 实例化或解析 MyService 的实例时,都会在实例化 MyService 的生命周期内预先解析 AnotherService 的一个实例。

当 MyService 处于事件状态时,换句话说,它的父生命周期范围处于事件状态,_anotherService 需要处于事件状态,无论它是否在 MyService 的其余代码中使用。

自有实例

请注意,服务的拥有实例是从刚刚创建的生命周期范围实例化的对象。

 Owned<IAnotherService> _anotherService ;


这个对象(_anotherService)的好处是在它实例化之前

  1. 将初始化一个新的生命周期
  2. AnotherService 实例在步骤 1 中新创建的生命周期范围内实例化

  3. 新的 AnotherService 实例及其容器生命周期将被绑定(bind)并形成 Owned 实例并注入(inject)到 MyService 类。

在您不再需要 _anotherService 的 MyService 生命周期中的任何时候,您都可以像直接调用它的 Dispose() 方法一样

_anotherService.Dispose() ;


一旦你处置它,那个对象和绑定(bind)的生命周期以及那个生命周期的任何其他子对象或依赖对象都将消失并被释放。 所以你不必忍受不必要的 _anotherService 和它的依赖组件的负载

所以我们的 MyService 的构造函数部分应该像下面这样:

    private readonly Owned<IAnotherService> _anotherService;

public MyService(Owned<IAnotherService> anotherService)
{
_anotherService = anotherService;
}

InstancePerOwned

这意味着我们有一个生命周期绑定(bind)到另一个服务,另一个服务在其中实例化。 如果你想强制上面生命周期内的所有新创建的对象和解析的组件共享另一个服务的同一个实例那么你必须像这样在注册时使用 InstancePerOwned

 builder.RegisterType<AnotherService>().As<IAnotherService>().InstancePerOwned<IAnotherService>();


并且一旦您将 AnotherService 注册为 InstancePerOwned,您就不能传递纯 IAnotherInstance,您必须像 Owned 一样传递它,否则您会得到异常。




您可以在 An Autofac Lifetime Primer 上阅读更多内容

编辑:修复了一个字符的拼写错误(编辑必须至少为 6 个字符!)

关于dependency-injection - 在 autofac 依赖注入(inject)中 InstancePerOwned 的正确用法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com