我正在开发Asp.net MVC项目。我按照link创建了通用存储库。
public class UnitOfWork : IDisposable
{
private LeisureEntities context = new LeisureEntities();
private IGenericInterface<cust_order> _customerOrderRepository;
private IGenericInterface<tblCustomer> _customerMasterRepository;
public IGenericInterface<cust_order> CustomerOrderRepository
{
get
{
return _customerOrderRepository = new GenericRepository<cust_order>(context);
}
}
public IGenericInterface<tblCustomer> CustomerMasterRepository
{
get
{
return _customerMasterRepository = new GenericRepository<tblCustomer>(context);
}
}
public void SaveChanges()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
我可以将UOW类中的所有存储库声明为属性,然后直接在控制器或服务层中使用此UOW。这意味着我在DAL中只有两个类,一个通用存储库类和一个具有db表所有属性的UOW类。
我是否需要为每个表创建单独的UOW。
我正在使用数据库第一种方法。
请建议。
答案 0 :(得分:3)
没有!!为所有实体创建UOW的方法是一种非常糟糕的方法。但抽象数据的想法很好。
我正在为所有实体使用GenericRepository。这是抽象数据的最佳方式。每个存储库都负责对给定实体的操作。
然后我在服务中提取所有业务逻辑 - &gt;这样,业务逻辑就按照SOLID原则在类库项目中分离。
每个对象都有它所需要的。我将为您提供一个开源git存储库来检查和重用我的架构。看看Data文件夹。
唯一的区别是您使用的是数据库第一种方法,解决方案是使用部分类扩展db上下文。
看看这个。这是通过遵循最佳实践来实现的。它可以很容易地扩展。
............................................... .................................................. .................................................. ..................
是的,这个体系结构有点抽象,我认为从初看起来太复杂了,但这可以解决你在未来发生之前的许多架构问题。我将根据您的需要粘贴您最简单的服务/业务逻辑/,以便您可以更清楚地了解它的全部内容和原因。
using Eshop.Data.Repositories;
namespace Eshop.Services.Data
{
using Contracts;
using Eshop.Data.Models;
using System.Linq;
public class CategoriesService : ICategoriesService
{
private IRepository<Category> repo;
public CategoriesService(IRepository<Category> repo)
{
this.repo = repo;
}
public IQueryable<Category> GetAllCategories()
{
var categoriesToReturn = this.repo.All().Where(x => x.IsDeleted != true);
return categoriesToReturn;
}
}
在所有服务中,您应该返回IQueryable并拥塞您的查询。在您的控制器中,您可以注入服务,控制器所在的Web部件对您的数据一无所知。当您使用Ninject或AutoFak注入具有依赖项反转的服务时,您可以使用这些方法并在控制器中实现查询结果。您可以看到我如何在家庭控制器中注入服务。您可以做的最好的事情是为您的视图模型使用Automapper并自动化属性。在这种情况下,您的控制器保持干净并具有几行代码。他们履行了缓存请求的义务,获取数据并将其传递给视图。我希望这对你有用。通过这种方法,您可以轻松地创建一个快速,易于支持和更改的大型项目。假设您可以非常轻松地更改数据库,在存储库中添加方法或者只是在其中添加一些其他自定义操作,例如,如果您想要通过id查询所有数据时将其标记为比您只需要进入GenericRepository并将此标志添加一行并瞧瞧:)