如何制作通用存储库?

我想知道是否有人在制作通用存储库时有任何好的教程(或者甚至可能是已经制作并且文档齐全的库)。

我正在使用linq到sql,但它可能会改变所以我不知道你是否可以创建一个通用的存储库,如果我说切换到entity framework,几乎没有任何变化。

谢谢

我想我还应该添加为什么我想要一个通用的存储库。 原因是在我的数据库中我喜欢公司表(订阅的用户是由其他人支付的)和个人表(通过谷歌或其他任何人找到我的网站并为自己的订阅付费的人)

但我会有2张非常相似的表格。 例如,我有2个设置表,一个用于企业用户,一个用于个人。

现在因为它们是2个不同的表,我需要2种不同的插入方法,因为我将它插入2个不同的表中,并且在当前时间只有一个字段是不同的(即PK)。

所以现在我需要所有这些重复的方法,我不希望这样。 也许我在我的数据库中所拥有的可能被认为是一个设计缺陷(也许它是)但这背后的原因之一是如果需要我可以很容易地将我的数据库拆分成2个不同的数据库而且我不会改变我的设计很快就会出现。

这是我对同一类型的另一个问题的答案。 希望能帮助到你:

为每个对象创建通用存储库与特定存储库的优势?

编辑:

听起来你想将两种具体类型视为一种逻辑类型。 为此,首先定义逻辑类型:

public interface ISubscription { // ... } 

然后,将具体类型定义为数据模型的一部分(接口将在另一个分部类中实现):

 [Table("CorporateSubscription")] public partial class CorporateSubscription : ISubscription { } [Table("IndividualSubscription")] public partial class IndividualSubscription : ISubscription { } 

接下来,定义对逻辑类型进行操作的存储库:

 public interface ISubscriptionRepository { CorporateSubscription GetCorporate(string key); IndividualSubscription GetIndividual(int userId); IEnumerable ListAll(); IEnumerable ListCorporate(); IEnumerable ListIndividual(); void Insert(ISubscription subscription); } 

最后,使用两个表来实现接口:

 public class SubscriptionRepository : ISubscriptionRepository { private readonly YourDataContext _dataContext; public SubscriptionRepository(YourDataContext dataContext) { _dataContext = dataContext; } #region ISubscriptionRepository public CorporateSubscription GetCorporate(string key) { return _dataContext.CorporateSubscriptions.Where(c => c.Key == key).FirstOrDefault(); } public IndividualSubscription GetIndividual(int userId) { return _dataContext.IndividualSubscriptions.Where(i => i.UserId == userId).FirstOrDefault(); } public IEnumerable ListAll() { return ListCorporate() .Cast() .Concat(ListIndividual().Cast()); } public IEnumerable ListCorporate() { return _dataContext.CorporateSubscriptions; } public IEnumerable ListIndividual() { return _dataContext.IndividualSubscriptions; } public void Insert(ISubscription subscription) { if(subscription is CorporateSubscription) { _dataContext.CorporateSubscriptions.InsertOnCommit((CorporateSubscription) subscription); } else if(subscription is IndividualSubscription) { _dataContext.IndividualSubscriptions.InsertOnCommit((IndividualSubscription) subscription); } else { // Forgive me, Liskov throw new ArgumentException( "Only corporate and individual subscriptions are supported", "subscription"); } } #endregion } 

这是一个插入的例子。 不要在演示者课程中过于紧张; 我只需要一种基于标志创建订阅的情况:

 public class CreateSubscriptionPresenter { private readonly ICreateSubscriptionView _view; private readonly ISubscriptionRepository _subscriptions; public CreateSubscriptionPresenter( ICreateSubscriptionView view, ISubscriptionRepository subscriptions) { _view = view; _subscriptions = subscriptions; } public void Submit() { ISubscription subscription; if(_view.IsCorporate) { subscription = new CorporateSubscription(); } else { subscription = new IndividualSubscription(); } subscription.Notes = _view.Notes; _subscriptions.Insert(subscription); } } 

Great Linq to Sql资源:

一个t4模板,它通过生成默认创建的内容,但可以完全自定义。

http://l2st4.codeplex.com/

使用Linq to Sql进行多层应用程序。 它有一个GenericObjectDataSource,我发现它非常方便

http://multitierlinqtosql.codeplex.com

只需一次搜索即可搜索IQueryable的所有属性

http://naspinski.codeplex.com/