我有一个实施工作单元的项目。通常,我使用 using 语句执行工作单元。阅读Autofac文档,它说“从容器中创建子生存期范围并从中解析”。。在我要使用工作单元的类中,是否使用构造函数注入来注入 ILifetimeScope 以便创建子生命周期范围?
using (var scope = container.BeginLifetimeScope())
{
var uow = scope.Resolve<IUnitOfWork>();
// do something
uow.Complete();
}
在应用程序执行期间,您将需要使用已注册的组件。您可以通过从生命周期范围内解决它们来做到这一点。
容器本身是生命周期的范围,从技术上讲,您可以直接从容器中解决问题。但是,不建议直接从容器中解析。
解析组件时,根据定义的实例范围,将创建对象的新实例。 (解析一个组件大致相当于调用“ new”来实例化一个类。确实,确实过分简化了,但是从类比的角度来看,这很好。)某些组件可能需要被处置(例如它们实现了IDisposable)-Autofac可以处理在处理生命周期范围时,将为您处理这些组件。
但是,容器在您的应用程序生命周期中一直存在。如果直接从容器中分解出很多东西,最终可能会挂起很多东西等待处置。这样不好(您可能会看到“内存泄漏”)。
相反,从容器中创建子生存期范围,然后从中进行解析。完成组件解析后,处置子范围,一切都将为您清除。
namespace DemoApp
{
public class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
// ...the stuff you saw earlier...
}
public static void WriteDate()
{
// Create the scope, resolve your IDateWriter,
// use it, then dispose of the scope.
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<IDateWriter>();
writer.WriteDate();
}
}
}
}
这是我出于学习目的而构建的网络应用程序(MVC)。我将从服务层运行我的工作单元。如果这是不正确的方法,请告诉我,但这就是我看到其他人这样做的方式。我相信它会在请求中运行,但是我将如何检查?调试?我不知道为什么需要隔离它。我只是在阅读Autofac文档,并且至少在执行部分中,他们建议不要从根本上解决问题,但请告诉我您是否有不同的看法。我正在学习,因此我想听听您的任何见解。谢谢!