Autofac拥有<>

时间:2016-02-18 18:29:25

标签: c# dependency-injection autofac

我不太了解Autofac Owned和非自备一次性组件之间的区别。

interface IMessageHandler
{
  void Handle(Message message);
}

class MessagePump
{
  Func<Owned<IMessageHandler>> _handlerFactory;

  public MessagePump(Func<Owned<IMessageHandler>> handlerFactory)
  {
    _handlerFactory = handlerFactory;
  }

  public void Go()
  {
    while(true)
    {
      var message = NextMessage();

      using (var handler = _handlerFactory())
      {
        handler.Value.Handle(message);
      }
    }
  }
}

以上代码与以下代码有什么区别:

 interface IMessageHandler
    {
      void Handle(Message message);
    }

    class MessagePump
    {
      Func<Owned<IMessageHandler>> _handlerFactory;

      public MessagePump(Func<IMessageHandler> handlerFactory)
      {
        _handlerFactory = handlerFactory;
      }

      public void Go()
      {
        while(true)
        {
          var message = NextMessage();

          using (var handler = _handlerFactory())
          {
            handler.Handle(message);
          }
        }
      }
    }

当我选择它们时,它们都是手动处理的,有什么区别?

2 个答案:

答案 0 :(得分:1)

不同之处在于,如果不使用Owned,则不会为T 及其依赖项创建嵌套生存期范围。如果您手动处置实例,则不会处置任何已注册为InstancePerLifetimeScope的依赖项,因为它们现在与MessagePump位于相同的生命周期范围内。

例如,如果您的处理程序本身依赖于数据库资源,那么一般的想法是您希望这些资源与您的处理程序一起生存,而不是使用我认为是长期存在的消息泵。

答案 1 :(得分:0)

您的第二个代码示例无法编译,因为handlerFactory构造函数参数和_handlerFactory字段的类型不同。

使用Owned<T>通知Autofac您不希望Autofac处理您的依赖关系,因为您将自己执行此操作。然后 - 您可以/应该使用using语句或直接在代码中调用Dispose()来处置依赖项,Dispose()不会自动调用。

如果您不打算使用Owned<T>依赖项,则不要自行处理依赖项 - 必要时,Autofac会为您执行此操作。您不必使用using语句,您不必记住依赖项是否是一次性的。