我想知道是否有人有关于制作通用存储库的任何好的教程(或者甚至可能是一个已经制作并记录良好的库)。

我目前正在使用 linq to sql 但它可能会改变,所以我不知道你是否可以制作一个通用存储库,如果我说切换到 Entity Framework ,它几乎不需要任何更改。

谢谢

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

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

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

所以现在我需要所有这些重复的方法,我不想要那样。也许我的数据库中的内容可以被视为设计缺陷(也许确实如此),但这背后的原因之一是,如果需要,我可以非常轻松地将我的数据库分解为 2 个不同的数据库,而且我不会更改我的设计很快。

最佳答案

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

Advantage of creating a generic repository vs. specific repository for each object?

编辑:

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

public interface ISubscription
{
    // ...
}

然后,将具体类型定义为数据模型的一部分(接口(interface)将在另一个分部类中实现):
[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);
}

最后,使用两个表实现接口(interface):
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
}

这是插入的示例。不要太沉迷于演示者类(class);我只需要一种基于标志创建订阅的情况:
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);
    }
}

关于c# - 如何制作通用存储库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2527651/

10-09 07:27
查看更多