gpt4 book ai didi

c# - 如何制作通用存储库?

转载 作者:行者123 更新时间:2023-11-30 12:18:16 24 4
gpt4 key购买 nike

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

我目前正在使用 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
}

这是一个插入的例子。不要太专注于演讲课;我只需要一种基于标志创建订阅的情况:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com