实体框架4.1数据库第一依赖注入工作单元

时间:2012-10-31 04:01:46

标签: .net entity-framework dependency-injection unit-of-work ef-database-first

好的,有大量的例子使用了Code First的依赖注入工作单元,使用了通用存储库和所有好东西。

有没有人用Database First(带有dbContext Generator(T4)的edmx),存储过程作为函数导入,带有依赖注入的工作单元这样做。

1 个答案:

答案 0 :(得分:2)

代码优先或dbfirst的上下文将是相同的(DbContext)。

存储过程映射到您的存储库而不是调用context。您调用context.Database.Query(“Proc_whatever”)的客户端。

是否有您需要帮助的特定位置,我可能有一个代码示例,但上面的所有内容都与di,代码优先,通用存储库等完成相同的方式。实现UnitOfWork的唯一变化是为了确保您的存储库不调用SaveChanges,您的UnitOfWork接口上有一个名为Save()的方法,该方法又调用保存更改。

我将更新https://github.com/adamtuliper/EF5-for-Real-Web-Applications处的代码以包含一个工作单元。我不喜欢这个实现,但是感觉不对,因此我更倾向于使用CQRS。

所以这里的想法是: 注入IUnitOfWork IUnitOfWork包含一个IContext,它也被注入并映射到Context。 IUnitOfWork映射到UnitOfWork具体实现。 UnitOfWork具体实现引用了存储库:

这部分偏离了我的头脑,所以请原谅任何编译错误,原则上要显示


public class YourContext : DbContext, IContext
{
   //just a regular DbContext class except use IDbSet
   public IDbSet Customers { get; set; }
}

public interface IUnitOfWork
{
     ICustomerRepository CustomerRepository { get; }
     IOrderRepository OrderRepository { get; }
     void Save();
}


 public class UnitOfWork : IUnitOfWork, IDisposable
 {
        private readonly IContext _context;
        private ICustomerRepository _customerRepository;
        private IOrderRepository _orderRepository;
        private bool _disposed = false;

        public UnitOfWork(IContext context)
        {
            _context = context;
        }

        public ICustomerRepository CustomerRepository
        {
            get
            {
                if (this._customerRepository == null)
                {
                    this._customerRepository = new CustomerRepository(_context);
                }
                return _customerRepository;
            }
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    ((IDisposable)_context).Dispose();
                }
            }
            this._disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

public class CustomerController : Controller
{
   private readonly IUnitOfWork _unitOfWork;
   public CustomerController(IUnitOfWork unitOfWork)
   {
      _unitOfWork = unitOfWork;
   }

   [AutoMap(typeof(Customer), typeof(CustomerIndexViewModel)]
   public ActionResult Index()
   {
        return _unitOfWork.CustomersRepository.GetAll();
        //or if not using AutoMapper, use the viewmodel directly:
        //return _unitOfWork.CustomersRepository.GetAll().Select(c => new CustomerIndexViewModel
                                                    {
                                                        CustomerId = c.CustomerId,
                                                        Address = c.Address,
                                                        City = c.City,
                                                        State = c.State,
                                                        FirstName = c.FirstName,
                                                        LastName = c.LastName
                                                    }).ToArray(); ;
   }
}

要使用proc,请在CustomerRepository中执行以下操作:


public Customer GetById(int id)
{
      return this.Context.Database.SqlQuery("Proc_GetCustomer @customerID", new SqlParameter("@customerID", id)).Single();
      //instead of:  return this.Context.Customers.Include(o => o.Orders).Single(o => o.CustomerId == id);
}