【发布时间】:2020-03-09 12:22:02
【问题描述】:
在 C# 中是否可以像在 C/C++ 中一样将类类型保存为预处理器指令?
我有多个共享代码的服务。主要区别在于调用正确的DbSet 和使用正确的类。
从以下代码到:
public class TaxService
{
readonly DatabaseContext db;
public TaxService(DatabaseContext database)
{
db = database;
}
public async Task<string> DeleteAsync(int? id)
{
if (await db.Taxes.FindAsync(id) is Tax tax)
{
string title = tax.Name;
db.Taxes.Remove(tax);
try
{
await db.SaveChangesAsync();
return title;
}
catch (Exception ex)
{
throw;
}
}
return null;
}
public async Task<List<Tax>> GetAllAsync()
{
return await db.Taxes.AsNoTracking().ToListAsync();
}
}
例如:
public class TaxService<T> where T : Tax
{
readonly DatabaseContext db;
DbSet<Tax> dbSet => db.Tax;
public TaxService(DatabaseContext database)
{
db = database;
}
public async Task<string> DeleteAsync(int? id)
{
if (await dbSet.FindAsync(id) is T tax)
{
string title = tax.Name;
dbSet.Remove(tax);
try
{
await db.SaveChangesAsync();
return title;
}
catch (Exception ex)
{
throw;
}
}
return null;
}
public async Task<List<T>> GetAllAsync()
{
return await dbSet.AsNoTracking().OfType<T>().ToListAsync();
}
}
Ofc 上面的设计存在问题。当我尝试调用TaxService 时,我必须通过泛型类型传递Tax 类=> TaxService<Tax>
同样在GetAllAsync 方法中,我必须使用OfType 方法来避免编译器错误。不可能将List<Tax> 作为List<T> 返回
对设计模式有什么建议吗?谢谢
编辑(对 M. B. 的回答):
public class TaxService : TaxService<Tax>
{
public TaxService(DatabaseContext database) : base(database)
{
}
}
public class TaxService<T> where T : Tax
【问题讨论】:
-
存储库模式,结合“工作单元”可以解决它。
-
@MortenBork 感谢您的想法。我研究了一下,如果每个类(T)对于 DeleteAsync 方法都有相同的属性(名称),它对我有用。有时它的标题,有时它的名称.. 我想避免使用反射
-
嗨。请看一下我作为答案提供的示例...通过添加“表达式”作为谓词,您可以在控制器中定义要删除的内容。
标签: c# design-patterns preprocessor-directive