有很多关于实现Linq to SQL仓储模式的例子。其中大部分都涉及到IRepository和DI;一些实现了工作单元,而有些没有。我尝试阅读了SO和Google上关于Linq to SQL仓储模式的搜索结果。然而,我还没有找到完整的解决方案。
根据我的阅读,我已经实现了以下仓储模式:
(来源:baburajpb at sites.google.com)
我使用DI来注册依赖于接口的仓库。
我为了避免在应用程序层中依赖于Linq to SQL,将查询结果作为业务对象的集合返回。上述情况在使用MVVM模式的WPF应用程序中运行良好。我有ViewModel和Presenter类,它们不依赖于由Linq-SQL生成的类。
如何扩展此模式以便将数据保存到数据库?我想将业务对象传回存储库并将其保存。是否可能?在这种情况下如何实现工作单元?
根据我的阅读,我已经实现了以下仓储模式:
![repository pattern](https://istack.dev59.com/yBtgz.webp)
我使用DI来注册依赖于接口的仓库。
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通用接口:
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的实现(未显示),并且依赖于IDataContextFactory,由DI负责处理:
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和Presenter类,它们不依赖于由Linq-SQL生成的类。
如何扩展此模式以便将数据保存到数据库?我想将业务对象传回存储库并将其保存。是否可能?在这种情况下如何实现工作单元?