【发布时间】:2012-01-31 23:43:30
【问题描述】:
我在网上看到了很多关于 UnitOfWork 和 Repo Pattern 的内容,但仍然不清楚为什么以及何时使用——这让我有些困惑。
考虑到我可以按照本文What are best practices for managing DataContext 中的建议,通过使用 IoC 来使用 DI 来测试我的存储库。我正在考虑将上下文作为对我的存储库构造函数的依赖项传递,然后像这样处理它?:
public interface ICustomObjectContext : IDisposable {}
public IRepository<T> // Not sure if I need to reference IDisposable here
public IMyRepository : IRepository<MyRepository> {}
public class MyRepository : IMyRepository
{
private readonly ICustomObjectContext _customObjectContext;
public MyRepository(ICustomObjectContext customObjectContext)
{
_customObjectContext = customObjectContext;
}
public void Dispose()
{
if (_customObjectContext != null)
{
_customObjectContext.Dispose();
}
}
...
}
我目前对将 UnitOfWork 与 Repository Pattern 结合使用的理解是跨多个存储库执行操作——这种行为似乎与 @Ladislav Mrnka 对 Web 应用程序的建议相矛盾:
对于 Web 应用程序,每个请求使用单个上下文。对于 Web 服务,每次调用使用单个上下文。在 WinForms 或 WPF 应用程序中,每个表单或每个演示者使用单个上下文。可能有一些特殊要求不允许使用这种方法,但在大多数情况下这就足够了。
查看完整答案here
如果我对他的理解正确,则 DataContext 应该是短暂的,并在每个请求或演示者的基础上使用(在其他帖子中也看到了这一点)。在这种情况下,repo 对上下文执行操作是合适的,因为范围仅限于使用它的组件——对吗?
我的存储库在 IoC 中注册为临时存储库,因此我应该为每个请求获取一个新存储库。如果这是正确的,那么我应该为每个请求获得一个新的上下文(上面的代码),然后处理它——也就是说......是否遵循上述约定?
【问题讨论】:
-
与您的问题没有太大关系:但是在您作为依赖注入到此类的类中放置一个对象看起来很邪恶。该类显然不负责实例化对象,因此它不负责处置它。
-
感谢@Slauma 在下面 Wouter 的说明中指出。我需要解决这个问题。
标签: asp.net entity-framework-4.1 ioc-container repository-pattern unit-of-work