asp.net-mvc-3 - 如何使用工作单元在存储库类中创建多个存储库对象?

  显示原文与译文双语对照的内容

我是MVC3应用开发的新手,目前,我们需要以下应用技术作为需求

  1. MVC3框架
  2. IOC框架- 动态管理对象创建的Autofac
  3. 最小最小值- 单元测试
  4. Entity Framework
  5. 知识库和工作单元 Pattern 模型类

我已经经历了许多文章,探讨上述点的基本思想,但仍然有点混淆了"仓库和工作单元的Pattern"。 基本上我理解工作单元是一个 Pattern,它跟随库 Pattern 在所有库对象之间共享单个数据库上下文。

IUnitOfWork.cs


public interface IUnitOfWork : IDisposable
{
 IPermitRepository Permit_Repository{ get; }
 IRebateRepository Rebate_Repository { get; }
 IBuildingTypeRepository BuildingType_Repository { get; }
 IEEProjectRepository EEProject_Repository { get; }
 IRebateLookupRepository RebateLookup_Repository { get; }
 IEEProjectTypeRepository EEProjectType_Repository { get; }
 void Save();

}

UnitOfWork.cs


public class UnitOfWork : IUnitOfWork
{
 #region Private Members

 private readonly CEEPMSEntities context = new CEEPMSEntities();
 private IPermitRepository permit_Repository;
 private IRebateRepository rebate_Repository;
 private IBuildingTypeRepository buildingType_Repository;
 private IEEProjectRepository eeProject_Repository;
 private IRebateLookupRepository rebateLookup_Repository;
 private IEEProjectTypeRepository eeProjectType_Repository;

 #endregion

 #region IUnitOfWork Implemenation

 public IPermitRepository Permit_Repository
 {
 get
 {
 if (this.permit_Repository == null)
 {
 this.permit_Repository = new PermitRepository(context);
 }
 return permit_Repository;
 }
 }

 public IRebateRepository Rebate_Repository
 {
 get 
 {
 if (this.rebate_Repository == null)
 {
 this.rebate_Repository = new RebateRepository(context);
 }
 return rebate_Repository;
 }
 }


}

PermitRepository 。cs


public class PermitRepository : IPermitRepository
{
 #region Private Members

 private CEEPMSEntities objectContext = null;
 private IObjectSet<Permit> objectSet = null;

 #endregion

 #region Constructors

 public PermitRepository()
 {
 }

 public PermitRepository(CEEPMSEntities _objectContext)
 {
 this.objectContext = _objectContext;
 this.objectSet = objectContext.CreateObjectSet<Permit>();
 }

 #endregion

 public IEnumerable<RebateViewModel> GetRebatesByPermitId(int _permitId)
 {
//need to implment
 }

}

PermitController 。cs


public class PermitController : Controller
{
 #region Private Members 
 IUnitOfWork CEEPMSContext = null;
 #endregion

 #region Constructors

 public PermitController(IUnitOfWork _CEEPMSContext)
 {
 if (_CEEPMSContext == null)
 {
 throw new ArgumentNullException("Object can not be null");
 }
 CEEPMSContext = _CEEPMSContext;
 }

 #endregion
}

这里我想知道如何使用相同的Pattern 生成一个新的存储库,比如" testrepository.cs",我可以在这里创建更多的存储库对象,比如


RebateRepository rebateRepo = new RebateRepository ()
AddressRepository addressRepo = new AddressRepository()

因为,我想创建的存储库对象,我需要一个UnitOfWork对象,首先是PermitController类中的implmented 。 所以如果我在每个存储库类中遵循同样的原则,那将会再次破坏工作单元的原则并创建对象上下文的多个实例。

因此,任何想法或者建议都将被。

谢谢你

时间:

你的IUnitOfWork 接口的职责太多。 每次添加新存储库时,都需要更改 IUnitOfWork 接口及其所有实现。

相反,像这样的?


public interface IUnitOfWork
{
 int SaveChanges();
}

然后,你可以在 Entity Framework ObjectContext或者DbContext中实现这里接口:


public MyCustomContext : DbContext, IUnitOfWork
{
//... this class already implements the SaveChanges method
}

然后,构造函数将工作单元注入到每个存储库中。 AutoFac可以确保同一个实例中使用的多个存储库之间共享同一个实例:


public class PermitRepository : IPermitRepository
{
 #region Private Members

 private readonly IObjectSet<Permit> _objectSet;
 private readonly IUnitOfWork _unitOfWork;

 #endregion

 #region Constructors

 public PermitRepository(IUnitOfWork unitOfWork, IObjectSet<Permit> objectSet)
 {
 _unitOfWork = unitOfWork;
 _objectSet = objectSet;
 }

 #endregion

 public IEnumerable<RebateViewModel> GetRebatesByPermitId(int _permitId)
 {
//need to implment
 }
}

然后,当构造函数将存储库插入到控制器中时,IUnitOfWork将自动注入到存储库中。


public class PermitController : Controller
{
 #region Private Members 
 private readonly IPermitRepository _permitRepos;
 #endregion

 #region Constructors

 public PermitController(IPermitRepository permitRepos)
 {
 if (permitRepos== null)
 {
 throw new ArgumentNullException("permitRepos");
 }
 _permitRepos = permitRepos;
 }

 #endregion
}

注意,在从存储库中查询数据时,实际上没有做任何工作,因这里IUnitOfWork接口不在这里处应用。 它在插入。更新和删除实体时应用,而不是在选择它们时应用。

...