gpt4 book ai didi

c# - 通用表

转载 作者:行者123 更新时间:2023-11-30 21:23:33 25 4
gpt4 key购买 nike

尝试将 Linq to SQL 用于我在家进行的一个小项目。我使用 dbmetal.exe(来自 DBLinq 项目)针对本地 MySQL 数据库生成了上下文代码和我的所有实体类。

一切都运行良好,但我正在尝试提取一些冗余代码,但在尝试这样做时遇到了问题。

基本上我所有的实体都是Table<TEntity>类型的在我的上下文类中。例如我有 Table<User>Table<Calendar> .

当我为存储库行为设计各种接口(interface)时,我意识到每个实体都有一些非常冗余的方法。例如 ID 字段:

User findById(int id);
Calendar findById(int id);

我设计了我的表格,所以它们都有 3 个共同的字段 [ID、DATECREATED、DATEUPDATED]。由于这些字段很常见,我希望有一个共同的行为,而不是为每个实体重写这些方法。

所以我让我的存储库类(UserRepository、CalendarRepository)继承了一个通用的“存储库”类,它是这样定义的:

public class Repository<T> : IDisposable, IRepository<T> where T : class
{
protected MyContext context;

private DbLinq.Data.Linq.Table<T> currentTable;

protected Repository() {
context = new MyContext();

Type currentType = this.GetType().GetGenericArguments()[0];
currentTable = //Set currentTable based on currentType. e.g.: currentTable = context.User;
}

#region IRepository<T> Members

public T findById(int? id)
{
return currentTable.SingleOrDefault(d => d.ID == id);
}

public T findByDateCreated(DateTime dateCreated)
{
return currentTable.SingleOrDefault(d => DateTime.Equals(dateCreated, d.DateCreated));
}

public T findByDateUpdated(DateTime dateUpdated)
{
return currentTable.SingleOrDefault(d => DateTime.Equals(dateUpdated, d.DateUpdated));
}

public T insert(T domainObject)
{
currentTable.InsertOnSubmit(domainObject);
return domainObject;
}

public T save(T domainObject)
{
context.SubmitChanges();
return domainObject;
}

#endregion

#region IDisposable Members

public void Dispose()
{
if (context != null)
context.Dispose();
}

#endregion
}

事实证明这比我想象的要难。当我尝试设置时:

currentTable = (Table<T>)context.User;

我收到以下错误:

Cannot convert type 'DbLinq.Data.Linq.Table<Models.Domain.User>' to 'DbLinq.Data.Linq.Table<T>'

隐式转换也不起作用。

有人成功做过类似的事情吗?如果我必须让我的所有 Repository 类都实现相同的 findById 方法并且其中包含完全相同的代码,那将是非常可悲的......我确信有一种方法可以不这样做,我只是找不到它. :)

最佳答案

That'd be very sad if I had to have all my Repository classes implement the same findById method with exactly the same code in it

代码并不完全相同。在每种情况下,您都指的是上下文中的不同表格。

我理解你的逻辑;你想干。但是您拥有存储库的原因是让您能够通过注入(inject)模拟存储库而不是您的真实存储库来抽象您的数据访问逻辑,以促进单元测试。最实用(和灵活)的方法是保持您的表(和您的 DAL 对象)独立且不同。通过尝试泛化部分 DAL 对象,您将引入额外的耦合,这将使您的单元测试复杂化。

关于c# - 通用表<TEntity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694851/

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