猿教程 Logo

Autofac教程:使用Lifetime Scopes

   。


创建新的生命周期范围

您可以通过在任何现有生命周期范围内调用BeginLifetimeScope()方法来创建生命周期范围,从根容器开始。 生命周期范围是一次性的,它们跟踪组件处理,因此请确保始终调用“Dispose()”“或将其包装在”using“语句中。

using(var scope = container.BeginLifetimeScope())
{
  // Resolve services from a scope that is a child
  // of the root container.
  var service = scope.Resolve<IService>();

  // You can also create nested scopes...
  using(var unitOfWorkScope = scope.BeginLifetimeScope())
  {
    var anotherService = unitOfWorkScope.Resolve<IOther>();
  }
}

标记终身职业¶

在某些情况下,您希望在工作单位之间分享服务,但您不希望这些服务在全球范围内像单身人士一样分享。 一个常见的例子是Web应用程序中的“per-request”生命周期。 (您可以在“实例范围”主题中阅读有关每个请求范围的更多信息。)在这种情况下,您需要将自己的生命周期范围和注册服务标记为InstancePerMatchingLifetimeScope()。

例如,假设您有一个发送电子邮件的组件。 您的系统中的逻辑事务可能需要发送多个电子邮件,因此您可以在逻辑事务的各个部分中共享该组件。 但是,您不希望电子邮件组件成为全球单身人士。 您的设置可能如下所示:

// Register your transaction-level shared component
// as InstancePerMatchingLifetimeScope and give it
// a "known tag" that you'll use when starting new
// transactions.
var builder = new ContainerBuilder();
builder.RegisterType<EmailSender>()
       .As<IEmailSender>()
       .InstancePerMatchingLifetimeScope("transaction");

// Both the order processor and the receipt manager
// need to send email notifications.
builder.RegisterType<OrderProcessor>()
       .As<IOrderProcessor>();
builder.RegisterType<ReceiptManager>()
       .As<IReceiptManager>();

var container = builder.Build();


// Create transaction scopes with a tag.
using(var transactionScope = container.BeginLifetimeScope("transaction"))
{
  using(var orderScope = transactionScope.BeginLifetimeScope())
  {
    // This would resolve an IEmailSender to use, but the
    // IEmailSender would "live" in the parent transaction
    // scope and be shared across any children of the
    // transaction scope because of that tag.
    var op = orderScope.Resolve<IOrderProcessor>();
    op.ProcessOrder();
  }

  using(var receiptScope = transactionScope.BeginLifetimeScope())
  {
    // This would also resolve an IEmailSender to use, but it
    // would find the existing IEmailSender in the parent
    // scope and use that. It'd be the same instance used
    // by the order processor.
    var rm = receiptScope.Resolve<IReceiptManager>();
    rm.SendReceipt();
  }
}

再次,您可以在“实例范围”主题中阅读有关标记范围和每个请求范围的更多信息。


添加对终身作用域的限制

Autofac允许您在创建生命范围时“即时添加”注册。 这可以帮助您,当您需要做一些“点焊”限制注册覆盖,或者如果您通常只需要一些您不想在全球注册的范围内的其他东西。 您可以将lambda传递给接受ContainerBuilder的BeginLifetimeScope()并添加注册。

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Autofac/working-with-scopes.html