几天前我开始学习使用Unity的存储库模式时,我的印象是这种模式的主要好处是将数据层与业务层分离。存储库模式通用应用程序
换句话说,如果需要改变方式,应用程序如何存储数据,这是非常容易的,因为只有一个主模型负责通信。
这意味着,如果应用程序当前将数据保存到序列化的XML文件中,则改变此逻辑以连接到数据库不会很困难。
我发现几个很好的演示也使用Unit Of Work
层,这看起来非常方便。让我告诉你一些我的代码。
public class UnitOfWork : IUnitOfWork
{
private readonly RepositoryContext _context;
public IEmployeeRepository Employees { get; set; }
public UnitOfWork(RepositoryContext context)
{
_context = context;
Employees = new EmployeeRepository(_context);
}
public int Complete()
{
return _context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
主要库上下文:
public class RepositoryContext : DbContext
{
public RepositoryContext() : base("name=RepositoryContext")
{
}
public virtual DbSet<Employee> Employees { get; set; }
public virtual DbSet<Equipment> Furniture { get; set; }
}
这里是演示EmployeeRepository:从一个普通的Repository
它看起来像这样
public class EmployeeRepository:Repository<Employee>, IEmployeeRepository
{
public EmployeeRepository(RepositoryContext context) : base(context) { }
public Employee GetEmployeeByName(string sName)
{
return MyContext.Employees.FirstOrDefault(n => n.Name == sName);
}
public RepositoryContext MyContext
{
get { return Context as RepositoryContext; }
}
}
员工库导出:
public class Repository<T> : Interfaces.Repositories.IRepository<T> where T : class
{
protected readonly DbContext Context;
public Repository(DbContext context)
{
Context = context;
}
public void Add(T item)
{
Context.Set<T>().Add(item);
}
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
{
return Context.Set<T>().Where(predicate);
}
public T Get(int ID)
{
return Context.Set<T>().Find(ID);
}
public IEnumerable<T> GetAll()
{
return Context.Set<T>().ToList();
}
public void Remove(T item)
{
Context.Set<T>().Remove(item);
}
}
这里有一个问题:
至于我的理解去,我们是直接宣称,这下我们在它的构造DbContext
,这是继在所有Add/Remove/Find
函数特定类下使用Repository
预期。
目前这个模型正在与数据库进行通信,但是如果我想要(不管什么原因)改变这个模型来保存XML文件中的数据,我将不得不完全重写我所有的Repository
类?或者我在这里错过了什么?
如果我错了,它很容易做到,任何人都可以告诉我如何更改代码,以便我们将值序列化到XML文件中吗?我试图更好地理解这个版本库模式,但现在对我来说这是一个很大的混乱。
任何关于此事的帮助/建议将不胜感激。
如果改变存储数据的方式,可能需要重新编写存储库类(这显然是预期的),但不是IRepository的使用者,因为接口保持不变,无论数据如何存储。所以你不需要改变业务类,这就是所谓的“从业务层分离数据层”。 –