似乎有很多关于为 Linq to SQL 实现存储库模式的示例。其中大部分以 IRepository 和 DI 为特色;有些已经实现了工作单元,有些没有。我试图阅读 SO 和 Google 在 Linq to SQL 存储库模式上搜索返回的大部分结果。尽管如此,我还没有遇到一个完整的解决方案。
根据我的阅读,我实现了一个存储库模式,如下所示:
(来源:baburajpb at sites.google.com)
我正在使用 DI 注册存储库所依赖的接口(interface):
this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(),
new InjectionConstructor(connectionString));
this.container.RegisterType<IDataContextFactory, DataContextFactory>();
存储库模式的实现:public interface IPrivilegeRepository : IRepository<PrivilegesEntity>
{
IList<MenuModel> GetRootMenu();
IList<MenuModel> GetChildMenu(int parentId);
}
public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository
{
#region IPrivilegeRepository Members
public IList<MenuModel> GetRootMenu()
{
return FindAll(menu => menu.ParentId == null)
.OrderBy(menu => menu.SortOrder)
.Select(c => EntityMapper.Privileges.ToBusinessObject(c))
.ToList();
}
public IList<MenuModel> GetChildMenu(int parentId)
{
return FindAll(menu => menu.ParentId == parentId)
.OrderBy(menu => menu.SortOrder)
.Select(menu => EntityMapper.Privileges.ToBusinessObject(menu))
.ToList();
}
#endregion
public PrivilegeRepository(IDataContextFactory dataContextFactory)
: base(dataContextFactory)
{
}
}
IRepository 通用接口(interface):public interface IRepository<T> where T : class
{
IEnumerable<T> All();
IEnumerable<T> FindAll(Expression<Func<T, bool>> exp);
T Single(Expression<Func<T, bool>> exp);
T First(Expression<Func<T, bool>> exp);
}
Repository 类通过 IRepository 的实现(未显示)实现如下,并且依赖于 DI 负责的 IDataContextFactory:public class Repository<T> : IRepository<T> where T : class
{
public Repository(IDataContextFactory dataContextFactory)
{
this.dataContextFactory = dataContextFactory;
}
}
使用 IoC 使用存储库:PrivilegeRepository repository = container.Resolve<PrivilegeRepository>();
我将查询结果作为业务对象的集合返回,以避免在我使用存储库的应用程序层上依赖 Linq to SQL。上述场景适用于我使用 MVVM 模式的 WPF 应用程序。我有 ViewModel aks Presenter 类,它们不依赖于 Linq-SQL 生成的类。如何扩展此模式以便将数据保存到数据库。我想将业务对象传回存储库并保存它们。是否可以?在这种情况下如何实现工作单元。
最佳答案
Here is an answer of mine to a similar question.
基本思想是通用存储库接口(interface)不能很好地工作,但通用存储库实现工作得很好。它使用 LINQ to SQL 作为示例 ORM,并且应该为您的问题提供一些见解。
一定要通读保罗的回答,尤其是评论。
关于linq-to-sql - 使用 IoC、依赖注入(inject)、工作单元的 Linq to SQL 的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624229/