如何让我的数据访问层更好?

时间:2013-05-30 09:35:02

标签: c# asp.net asp.net-mvc entity-framework

我已经使用实体框架和存储库模式玩了一段时间,但我想知道我当前所做的事情是否有任何问题或者我如何改进它。

我的场景经常要求我从人力资源系统Oracle数据库中读取ReadOnly,然后对于我正在处理的应用程序,我倾向于将该应用程序的数据存储在自己的MS Sql数据库中,偶尔也会在我自己的一些表中存储我已在HR Oracle数据库中创建。

我的目标是获得可重用,可靠的访问数据的方法,并确保数据可以高效可靠的方式使用。我还需要找出为某些实体创建一些更具体的数据访问方法的最佳方法,例如:我的通用存储库没有创建,编辑或删除方法,因为我想消除HR数据库中编辑数据的风险,但正如我所说,我可能有自己的表,我想编辑,创建和删除数据HR数据库。同样地,我可能想使用我的通用存储库和单元工作来访问我目前不知道如何进行的多个数据源。

此外,我目前不使用任何接口,并想知道我是否可以或应该实现这些,如IRepository,IUnitOfWork,IContext等?

目前,我使用针对DbContext的通用存储库模式来提供一些处理数据的基本方法。然后,我有一个单元工作实现,以便我可以轻松访问我的实体模型的各种存储库。

e.g。

UnitOfWork uow = new UnitOfWork();
var data = uow.StaffRepository.Get();

以下是我目前的实施情况:

通用存储库

public class GenericRepository<T> where T : class
{
    internal CHRISCSEntities c21context;
    internal DbSet<T> dbSet;

    public GenericRepository(CHRISCSEntities c21context)
    {
        this.c21context = c21context;
        this.dbSet = c21context.Set<T>();
    }

    public virtual IEnumerable<T> Get(
        Expression<Func<T, bool>> filter = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<T> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

    public virtual T GetByID(object id)
    {
        return dbSet.Find(id);
    }
}

这是我的UnitOfWork:

public class UnitOfWork : IDisposable
{
    private CHRISCSEntities c21context = new CHRISCSEntities();

    private GenericRepository<EMPOS> emposRepository;
    private GenericRepository<PSLDW> psldwRepository;
    private GenericRepository<UPZ88> upz88Repository;
    private GenericRepository<EMLVE> emlveRepository;
    private GenericRepository<EMDET> emdetRepository;
    private GenericRepository<PSDET> psdetRepository;
    private GenericRepository<DASH_PYLVR> pylvrRepository;

    public GenericRepository<DASH_PYLVR> PylvrRepository
    {
        get
        {

            if (this.pylvrRepository == null)
            {
                this.pylvrRepository = new GenericRepository<DASH_PYLVR>(c21context);
            }
            return pylvrRepository;
        }
    }

    public GenericRepository<PSDET> PsdetRepository
    {
        get
        {

            if (this.psdetRepository == null)
            {
                this.psdetRepository = new GenericRepository<PSDET>(c21context);
            }
            return psdetRepository;
        }
    }

    public GenericRepository<EMDET> EmdetRepository
    {
        get
        {

            if (this.emdetRepository == null)
            {
                this.emdetRepository = new GenericRepository<EMDET>(c21context);
            }
            return emdetRepository;
        }
    }

    public GenericRepository<EMLVE> EmlveRepository
    {
        get
        {

            if (this.emlveRepository == null)
            {
                this.emlveRepository = new GenericRepository<EMLVE>(c21context);
            }
            return emlveRepository;
        }
    }

    public GenericRepository<EMPOS> EmposRepository
    {
        get
        {

            if (this.emposRepository == null)
            {
                this.emposRepository = new GenericRepository<EMPOS>(c21context);
            }
            return emposRepository;
        }
    }

    public GenericRepository<PSLDW> PsldwRepository
    {
        get
        {

            if (this.psldwRepository == null)
            {
                this.psldwRepository = new GenericRepository<PSLDW>(c21context);
            }
            return psldwRepository;
        }
    }

    public GenericRepository<UPZ88> Upz88Repository
    {
        get
        {

            if (this.upz88Repository == null)
            {
                this.upz88Repository = new GenericRepository<UPZ88>(c21context);
            }
            return upz88Repository;
        }
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                c21context.Dispose();
            }
        }
        this.disposed = true;
    }

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

非常感谢任何帮助,

安迪

2 个答案:

答案 0 :(得分:1)

您可以查看有关架构here的系列中的代码。它与IOC一起使用接口。

答案 1 :(得分:1)

对dal使用依赖注入,并使用界面,这样就不必依赖特定的类。

请参阅以下链接。 http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

哪个是存储库和IUnitOfWork演示。