因此,我使用UNITY容器,将DataContext的单例实例注入到每个存储库中。通过在Google上快速搜索,每个人都建议不要使用DataContext的单例实例,因为它可能会在未来导致一些内存泄漏问题。
因此,受此帖子的启发,为每个Web请求创建DataContext的单例实例是答案(如果我错了,请纠正我!) 然而,UNITY不支持“Per-web-request”生命周期管理器。但是,您可以实现自己的自定义生命周期管理器来处理此问题。实际上,这在以下帖子中讨论: Unity中的Singleton Per Call Context(Web Request) 问题是,我现在已经按照上述帖子中描述的方式实现了自定义生命周期管理器,但我不确定这是否是正确的方法。我也想知道提供的解决方案中数据上下文实例是在哪里被处理的。我有遗漏的内容吗?
实际上,是否有更好的方法来解决我的“问题”?
谢谢!
**添加关于我的实现的信息**
以下是来自我的Global.asax、Controller和Repository的片段。这清晰地展示了我的实现情况。
Global.asax
var container = new UnityContainer();
container
.RegisterType<ProductsRepository>(new ContainerControlledLifetimeManager())
.RegisterType<CategoryRepository>(new ContainerControlledLifetimeManager())
.RegisterType<MyEntities>(new PerResolveLifetimeManager(), dbConnectionString)
控制器
private ProductsRepository _productsRepository;
private CategoryRepository _categoryRepository;
public ProductsController(ProductsRepository productsRepository, CategoryRepository categoryRepository)
{
_productsRepository = productsRepository;
_categoryRepository = categoryRepository;
}
public ActionResult Index()
{
ProductCategory category = _categoryRepository.GetProductCategory(categoryId);
.
.
.
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_productsRepository.Dispose();
_categoryRepository.Dispose();
}
产品存储库
public class ProductsRepository : IDisposable
{
private MyEntities _db;
public ProductsRepository(MyEntities db)
{
_db = db;
}
public Product GetProduct(Guid productId)
{
return _db.Product.Where(x => x.ID == productId).FirstOrDefault();
}
public void Dispose()
{
this._db.Dispose();
}
控制器工厂
public class UnityControllerFactory : DefaultControllerFactory
{
IUnityContainer _container;
public UnityControllerFactory(IUnityContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, String.Format("The controller for path '{0}' could not be found" +
"or it does not implement IController.",
requestContext.HttpContext.Request.Path));
}
return _container.Resolve(controllerType) as IController;
}
}
附加信息 您好,我会发布一些相关问题和解决方案建议的链接:
- https://github.com/geersch/EntityFrameworkObjectContext
- http://dotnetslackers.com/articles/ado_net/Managing-Entity-Framework-ObjectContext-lifespan-and-scope-in-n-layered-ASP-NET-applications.aspx
- 将linq附加到业务层中的httpcontext的数据上下文
- http://weblogs.asp.net/shijuvarghese/archive/2008/10/24/asp-net-mvc-tip-dependency-injection-with-unity-application-block.aspx
- http://msdn.microsoft.com/en-us/library/bb738470.aspx