似乎有很多關於實現Linq to SQL的Repository模式的示例。其中大多數都具有IRepository和DI;有些已經實施了工作單位,有些則沒有。我嘗試將大部分由SO和Google上的搜索返回的結果閱讀爲從Linq到SQL存儲庫模式。儘管如此,我還沒有遇到完整的解決方案。Linq to SQL使用IoC,依賴注入,工作單元的存儲庫模式
從我讀,我實現了一個存儲庫模式,如下圖所示:
我使用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);
}
庫類被實現,如下面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>();
我將查詢的結果作爲Business Object的集合返回以避免依賴Lin q到我使用存儲庫的應用程序層上的SQL。上述場景適用於使用MVVM模式的WPF應用程序。我有ViewModel aks Presenter類,它們不依賴Linq-SQL生成的類。
如何擴展此模式以便將數據保存到數據庫。我想將Business Objects傳遞迴存儲庫並保存它們。可能嗎?如何在這種情況下實施工作單元。
你可能想看看活動記錄模式;它涵蓋了完整的CRUD操作以及類似存儲庫的查詢訪問功能。 – 2009-10-26 11:19:54
與VS2010一起發佈的實體框架如何? – Raj 2009-11-08 05:55:44
@Raj我想你錯過了他想成爲ORM獨立的事實。 – Novus 2012-07-26 17:36:20