autofac依赖注入中InstancePerOwned的正确用法是什么?

时间:2015-01-29 01:39:32

标签: dependency-injection inversion-of-control autofac

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

1 个答案:

答案 0 :(得分:3)

请考虑以下代码

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的lifetimescope中预先解析AnotherService的一个实例。

     虽然MyService还活着,换句话说,它的生命时间镜还活着,但是无论是否在MyService的其余代码中使用它,其他服务都需要活着。

拥有实例

请注意,服务的Owned实例是从刚刚创建的lifetimescope实例化的对象。

 Owned<IAnotherService> _anotherService ;


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

  1. 将初始化新的lifetimescope
  2. 在步骤1中,在新创建的lifetimescope中实例化了AnotherService的实例

  3. 新的AnotherService实例及其容器lifetimescope将被绑定并形成Owned的实例并注入MyService类。

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

    _anotherService.Dispose() ;
    


    一旦你处置它,那个物体和受约束的生命望远镜以及该生命望远镜的任何其他子物体或依赖物体将会消失并被释放。      因此,您不必承担_anotherService的不必要的存在以及它的相关组件的负载

    因此MyService的构造函数部分应如下所示:

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

    InstancePerOwned

    这意味着我们有一个lifetimescope绑定到另一个服务实例化的anotherService。      如果要强制在lifetimescope上面的所有新创建的对象和已解析的组件共享另一个ServiceService的相同实例 那么你必须在注册时使用InstancePerOwned,如

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


    一旦你将AnotherService注册为InstancePerOwned,你就无法传递纯粹的IAnotherInstance,你必须像拥有它一样传递它,否则你会得到例外。·




    你可以在An Autofac Lifetime Primer

    上阅读更多内容

    编辑:修正了一个字符错误(编辑必须至少6个字符!)