Autofac Owned<>

本文关键字:gt Owned lt Autofac | 更新日期: 2023-09-27 18:35:25

我不太明白Autofac拥有和不拥有一次性组件之间的区别。

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);
          }
        }
      }
    }

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

Autofac Owned<>

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

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

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

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

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