簡體   English   中英

如何制作通用存儲庫?

[英]How to make a Generic Repository?

我想知道是否有人在制作通用存儲庫時有任何好的教程(或者甚至可能是已經制作並且記錄良好的庫)。

我正在使用linq到sql,但它可能會改變所以我不知道你是否可以創建一個通用的存儲庫,如果我說切換到實體框架,幾乎沒有任何變化。

謝謝

我想我還應該添加為什么我想要一個通用的存儲庫。 原因是在我的數據庫中我喜歡公司表(訂閱的用戶是由其他人支付的)和個人表(通過谷歌或其他任何人找到我的網站並為自己的訂閱付費的人)

但我會有兩張非常相似的牌桌。 例如,我有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<ISubscription> ListAll();

    IEnumerable<CorporateSubscription> ListCorporate();

    IEnumerable<IndividualSubscription> 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<ISubscription> ListAll()
    {
        return ListCorporate()
            .Cast<ISubscription>()
            .Concat(ListIndividual().Cast<ISubscription>());
    }

    public IEnumerable<CorporateSubscription> ListCorporate()
    {
        return _dataContext.CorporateSubscriptions;
    }

    public IEnumerable<IndividualSubscription> 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM