在UOW类(通用存储库模式)中拥有所有表属性是否合适?

时间:2016-03-21 08:54:07

标签: asp.net-mvc

我正在开发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。

我正在使用数据库第一种方法。

请建议。

1 个答案:

答案 0 :(得分:3)

没有!!为所有实体创建UOW的方法是一种非常糟糕的方法。但抽象数据的想法很好。

我正在为所有实体使用GenericRepository。这是抽象数据的最佳方式。每个存储库都负责对给定实体的操作。

然后我在服务中提取所有业务逻辑 - &gt;这样,业务逻辑就按照SOLID原则在类库项目中分离。

每个对象都有它所需要的。我将为您提供一个开源git存储库来检查和重用我的架构。看看Data文件夹。

唯一的区别是您使用的是数据库第一种方法,解决方案是使用部分类扩展db上下文。

看看这个。这是通过遵循最佳实践来实现的。它可以很容易地扩展。

Mvc eshop architecture

............................................... .................................................. .................................................. ..................

是的,这个体系结构有点抽象,我认为从初看起来太复杂了,但这可以解决你在未来发生之前的许多架构问题。我将根据您的需要粘贴您最简单的服务/业务逻辑/,以便您可以更清楚地了解它的全部内容和原因。

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并将此标志添加一行并瞧瞧:)