C# 依赖注入的对象处理
我已经创建了一个要在代码隐藏页面中使用的存储库类。我在代码隐藏页面中使用构造函数注入来实例化存储库 存储库类:C# 依赖注入的对象处理,c#,dependency-injection,repository-pattern,idisposable,C#,Dependency Injection,Repository Pattern,Idisposable,我已经创建了一个要在代码隐藏页面中使用的存储库类。我在代码隐藏页面中使用构造函数注入来实例化存储库 存储库类: BritanniaPremierEntities PBEntities = new BritanniaPremierEntities(); public IQueryable<TradeRoutes> GetRoutes() { var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDat
BritanniaPremierEntities PBEntities = new BritanniaPremierEntities();
public IQueryable<TradeRoutes> GetRoutes()
{
var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDate);
return routes;
}
public IQueryable<TradeRoutes> GetExpiredRoutes()
{
var routes = PBEntities.TradeRoutes.Where(
c => c.ConsignmentDate <= System.DateTime.Now);
return routes;
}
这就是我有点困惑的地方。如何确保正确处置存储库?例如,我无法使用代码隐藏页面中的语句包装存储库调用,因此无法使用存储库中的dispose方法。好的,通常的想法是,DI容器创建的任何内容都会被释放,只要它是
IDisposable
。唯一的问题是什么时候发生。我怀疑不同容器之间可能存在差异,但我的想法是在所创建的对象中实现Dispose()
,并在所注入的对象上显式调用Dispose()
具体地说,您应该记住始终发布您解决的问题。编写者有责任跟踪是否应该处理依赖关系。这不是微不足道的,因为它取决于不同的因素:
- 依赖项是否实现IDisposable
- 依赖项的生存期是否指示应立即或稍后释放它
这是一项非常复杂的任务,因此您应该为该作业使用适当的DI容器
但是,请记住,这最终取决于DI容器是否支持退役。例如,Castle Windsor有,StructureMap没有。有很多事情要考虑,但我得到了RRR的一般概念。我看过温莎城堡。是生活方式的组成部分解决了这个问题吗?是的,但大多数时候都是间接的。有关温莎的详细信息,请参阅:非常有用,谢谢。我不想深入探讨这个问题,除非发生了一些“神奇的事情”。这是更好的答案——注入的资源需要在容器上进行处理和IDisposable实现。对于这样的简单情况,不需要RRR模式。
private IRepository repos;
public Admin_TradeRoutesAdmin()
: this(new Repository())
{
}
public Admin_TradeRoutesAdmin(IRepository repos)
{
this.repos = repos;
}
public IQueryable GetTradeRoutes()
{
// call repository method
return repos.GetRoutes();
}