asp.net-mvc – 已经处理了DbContext和autofac
我有一个控制器:
private readonly ILogger _logger; private readonly IRepository _repository; public HomeController(ILogger logger,IRepository repository) { _logger = logger; _repository = repository; } 这是存储库: public class EfRepository : IRepository { // ...methods for add,delete,update entities // .... public void Dispose() { if (this._context != null) { this._context.SaveChanges(); (this._context as IDisposable).Dispose(); this._context = null; } } } 最后,IoC中的注册类型: _builder.RegisterType<Logger>().As<ILogger>(); _builder.RegisterType<EfRepository>().As<IRepository>().WithParameter("context",new PcpContext()); 当我运行应用程序时,我收到此错误:
我试着像这样改变注册EfRepository: _builder.RegisterType<EfRepository>() .As<IRepository>() .WithParameter("context",new PcpContext()).InstancePerLifetimeScope(); 在这种情况下,第一个请求完成,但在尝试打开其他页面时,我再次收到错误.哪里有问题? 解决方法
使用WithParameter方法时,参数实例对于每个已解析的对象都是相同的.因此,使用.WithParameter(“context”,new PcpContext()),您可以有效地为任何已解析的IRepository实例使用PcpContext类的相同实例.
使用当前代码,在处理IRepository实例时,它还将释放该PcpContext实例.然后,任何后续尝试解析IRepository都将接收已处置的PcpContext实例.您需要一种方法在每个Http请求上接收一个新的EF DbContext实例,该请求在请求结束时处理. 一种选择可以是为IRepository注册代码块,以便每次需要解析IRepository时执行代码块: _builder.Register<IRepository>(c => new EfRepository(new PcpContext())) 一个更好的选择是创建一个新的IDatabaseContext抽象,更新EfRepository,因此它依赖于新的IDatabaseContext抽象而不是PcpContextclass(可能已经是这种情况:)). IDatabaseContext的实现类将是您的PcpContext类,它必须从EF DbContext继承并可能接收连接字符串作为参数. public class EfRepository : IRepository { private readonly IDatabaseContext _context; public EfRepository(IDatabaseContext context) { _context = context; } ...methods for add,update entities //There is no longer need for this to be disposable. //The disaposable object is the database context,and Autofac will take care of it //public void Dispose() } public interface IDatabaseContext : IDisposable { ... declare methods for add,update entities } public class PcpContext: DbContext,IDatabaseContext { public EntityFrameworkContext(string connectionString) : base(connectionString) { } ...methods exposing EF for add,update entities //No need to implement IDisposable as we inherit from DbContext //that already implements it and we don′t introduce new resources that should be disposed of } 使用IoC容器并将生命周期管理负担留给他们的想法变得更好.现在,您的Repository类不需要是一次性的,也不需要管理和处理其IDatabaseContext依赖项. Autofac将跟踪上下文实例并在适当时处理它. 出于同样的原因,您可能希望将InstancePerLifetimeScope与数据库上下文相关性一起使用.这意味着在同一个Http请求中为每个存储库实例共享相同的EF上下文,并在请求结束时进行处理. _builder.RegisterType<EfRepository>() .As<IRepository>(); _builder.RegisterType<PcpContext>() .As<IDatabaseContext>() .WithParameter("connectionString","NameOfConnStringInWebConfig") .InstancePerLifetimeScope(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将我的思维模式从ASP.NET迁移到ASP.NET MVC(2)时需要了解哪
- asp.net – 兼容模式下的IE9无法正确显示CSS样式
- asp.net-mvc – 从另一个ActionResult返回ActionResult
- 动手造轮子:实现一个简单的依赖注入(二) --- 服务注册优化
- 如何从ASP.NET中的代码隐藏文件访问IFRAME?
- ASP.Net MVC C#另一个viewmodel中的两个viewmodel – 如何在
- 学习:正则表达式的基本语法
- 从2.0到3.5的ASP.NET框架效应?
- asp.net-mvc – 如何动态绑定kendo mvc ui dropdownlist
- asp.net-mvc – ASP.NET MVC:多视图文件夹和_ViewStart.cs
- asp.net-web-api – 用于自托管模式的WebApi按请
- asp.net – 脚本标记和“<%...%>”标记之间有什
- 在asp.net网页中尝试WebSecurity.CreateAccount时
- ASP.Net / C#:替换数据绑定字段中的字符
- asp.net-core – 将标识移动到类库ASP.Net Core
- asp.net-mvc-3 – DBContext,状态和原始值
- asp.net-mvc – 可在LAN中远程访问的IIS页面,但不
- asp.net – 在UpdatePanel asyncpostback后丢失的
- 如何在ASP.NET中用C#编程设置(使用GET SET属性)“
- asp.net-mvc – 是否可以在一个命令中搭建多个控