首页 / C# / c# – 如何制作通用存储库?
c# – 如何制作通用存储库?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何制作通用存储库?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3627字,纯文字阅读大概需要6分钟。
内容图文
![c# – 如何制作通用存储库?](/upload/InfoBanner/zyjiaocheng/783/af6f3fa340d54fa2b4f3a5aae117d52c.jpg)
我想知道是否有人在制作通用存储库时有任何好的教程(或者甚至可能是已经制作并且记录良好的库).
我正在使用linq到sql,但它可能会改变所以我不知道你是否可以创建一个通用的存储库,如果我说切换到实体框架,几乎没有任何变化.
谢谢
我想我还应该添加为什么我想要一个通用的存储库.原因是在我的数据库中我喜欢公司表(订阅的用户是由其他人支付的)和个人表(通过谷歌或其他任何人找到我的网站并为自己的订阅付费的人)
但我会有两张非常相似的牌桌.例如,我有2个设置表,一个用于企业用户,一个用于个人.
现在因为它们是2个不同的表,我需要2种不同的插入方法,因为我将它插入2个不同的表中,并且在当前时间只有一个字段是不同的(即PK).
所以现在我需要所有这些重复的方法,我不希望这样.也许我在我的数据库中所拥有的可能被认为是一个设计缺陷(也许是)但这背后的原因之一是如果需要我可以很容易地将我的数据库拆分成2个不同的数据库而且我不会改变我的设计很快就会出现.
解决方法:
这是我对同一类型的另一个问题的回答.希望能帮助到你:
Advantage of creating a generic repository vs. specific repository for each object?
编辑:
听起来你想将两种具体类型视为一种逻辑类型.为此,首先定义逻辑类型:
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);
}
}
内容总结
以上是互联网集市为您收集整理的c# – 如何制作通用存储库?全部内容,希望文章能够帮你解决c# – 如何制作通用存储库?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。