c# – 如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖关系的实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖关系的实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3309字,纯文字阅读大概需要5分钟。
内容图文
我们在Windows服务中托管了多个应用程序,这些应用程序自托管Nancy端点,以便公开有关应用程序操作的检测.
我们使用Autofac作为我们的IOC.在所有应用程序共享的核心DLL中,将几个存储库注册到根容器中;然后使用从Nancy.Autofac.Bootstrapper派生的引导程序将此容器作为其容器传递给Nancy.
我们发现,当Nancy收到Web请求时,它会从根容器中解析对存储库的请求,这会导致内存被非垃圾收集的IDisposable消耗,因为根容器不会超出范围(它具有Windows服务的生命周期).这导致服务“泄漏”内存.
然后我们切换到一个模型,我们在Nancy bootstrapper中使用重写的ConfigureRequestContainer()方法使用InstancePerRequest添加了存储库的注册:
protected override void ConfigureRequestContainer(ILifetimeScope container, NancyContext context)
{
base.ConfigureRequestContainer(container, context);
PerRequestContainerBuilder().Update(container.ComponentRegistry);
}
private static ContainerBuilder PerRequestContainerBuilder()
{
var builder = new ContainerBuilder();
// Dependency for repository
builder.RegisterType<SystemDateTimeProvider>().InstancePerRequest().As<IDateTimeProvider>();
// Repository
builder.RegisterType<BookmarkRepository>().InstancePerRequest().As<IBookmarkRepository>();
return builder;
}
我们还覆盖CreateRequestContainer()方法,以使用标记MatchingScopeLifetimeTags.RequestLifetimeScopeTag创建请求容器.
protected override ILifetimeScope CreateRequestContainer(NancyContext context)
{
return ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
}
这似乎解决了IDisposables没有被处理的问题 – 子请求容器被放置在Web请求管道的末尾,并且由它解析的对象也被处理并最终被垃圾收集.
我们的问题是,这似乎是将存储库的实现细节泄漏到服务中,因为我们不仅要在ConfigureRequestContainer()中注册存储库,还要注册存储库所需的任何其他对象,即如果我们想要更改实现我们必须“遍历依赖链”以使用它来注册每个服务中的所需对象 – 这似乎是错误的.
有没有办法让我们可以让Autofac从根容器中解析存储库的支持对象,但是将注册信息保存在Web请求容器的范围内?或者有没有办法在创建根容器时自动将现有注册从子容器复制到子容器中?
解决方法:
Autofac应自动解析“父”生命周期中的实例.如果使用InstancePerRequest配置注册,Autofac将使用特殊的生命周期标记MatchingScopeLifetimeTags.RequestLifetimeScopeTag注册这些服务,以便以后可以在正确的范围内解析.
这意味着不需要使用Nancy bootstrapper的ConfigureRequestContainer方法来执行请求范围的注册.你已经做到了!只要Nancy使用InstancePerRequest中使用的相同标记创建请求生存期(从Nancy 1.1开始就是done by default),应该正确解析服务.
例:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
// Do request-scoped registrations using InstancePerRequest...
var container = builder.Build();
// Pass the pre-built container to the bootstrapper
var bootstrapper = new MyAwesomeNancyBootstrapper(container);
app.UseNancy(options => options.Bootstrapper = bootstrapper);
}
}
public class MyAwesomeNancyBootstrapper : AutofacNancyBootstrapper
{
private readonly ILifetimeScope _lifetimeScope;
public MyAwesomeNancyBootstrapper(ILifetimeScope lifetimeScope)
{
_lifetimeScope = lifetimeScope;
}
protected override ILifetimeScope GetApplicationContainer()
{
return _lifetimeScope; // Tell Nancy you've got a container ready to go ;)
}
}
此设置应该足够(从Nancy 1.1开始.在早期版本中,您还必须覆盖CreateRequestContainer方法并在创建请求生存期范围时传递请求生命周期标记).
编辑:我在https://github.com/khellang/Nancy.AutofacExample为你举了一个例子
内容总结
以上是互联网集市为您收集整理的c# – 如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖关系的实例全部内容,希望文章能够帮你解决c# – 如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖关系的实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。