【发布时间】:2017-02-09 14:54:23
【问题描述】:
这是我在这里的第一个问题,我对 C# 术语不是很熟悉,所以如果我混淆了一些术语或定义,我会提前道歉。
我已经设置了一个通用的 EF 数据访问层;
public class BaseService<TObject> where TObject : class
{
private DbContext Context;
private static readonly Lazy<BaseService<TObject>> lazy = new Lazy<BaseService<TObject>>(() => new BaseService<TObject>());
public static BaseService<TObject> Instance => lazy.Value;
public BaseService()
{
Context = new evEntities();
}
public BaseService(DbContext context)
{
Context = context;
}
public ICollection<TObject> GetAll()
{
return Context.Set<TObject>().ToList();
}
public async Task<ICollection<TObject>> GetAllAsync()
{
return await Context.Set<TObject>().ToListAsync();
}
public TObject Get(int id)
{
return Context.Set<TObject>().Find(id);
}
}
连同这个;
public static class DA
{
public static DataAccess.Categories Categories => new DataAccess.Categories();
public static DataAccess.Tags Tags => new DataAccess.Tags();
public static DataAccess.Users Users => new DataAccess.Users();
}
public static class DA<T> where T : class
{
public static BaseService<T> Base => new BaseService<T>();
}
所以在我的业务层中我可以做到这一点;
public class Categories
{
public Categories() { }
public ICollection<Database.Categories> GetAll()
{
return DA.Categories.GetAll().ToList();
}
public async Task<ICollection<Database.Categories>> GetAllAsync()
{
return await DA.Categories.GetAllAsync();
}
public Database.Categories Get(int id)
{
return DA.Categories.Get(id);
}
}
为了清楚起见。我的 EF 创建了像“Database.Categories”和“Database.Users”这样的类/实体,我将它们作为“TObject”传递给我的 BaseService 以获得从我的数据库中为所有实体提取数据的标准方法.
现在我的问题。以类似的方式,我想创建一个通用的业务层。喜欢;
public class BusinessLogicBase<TModel>
{
public ICollection<TDBModel> GetAll()
{
return null;
}
public async Task<ICollection<TDBModel>> GetAllAsync()
{
return await DA.Categories.GetAllAsync();
}
public TDBModel Get(int id)
{
return DA.Categories.Get(id);
}
}
我希望能够使用诸如 Database.Categories 之类的 TObject 调用 DA,但这必须是动态的,基于传递给 BusinessLogicBase 的类型。所以我想做这样的事情(这是行不通的);
private ???? DetermineDatabaseModel()
{
switch(typeof(TModell))
{
case Models.Categories:
return Database.Categories;
case Models.Users:
return Database.Users;
}
}
所以我可以这样做;
public ICollection<TDBModel> GetAll()
{
var databaseModel = DetermineDatabaseModel()
return DA<databaseModel>().GetAll();
}
希望你能理解我的问题并能帮助我。
谢谢!
抱歉发了这么长的帖子,对于你们这些 9gaggers,这是一个土豆……不开玩笑,这是认真的。
【问题讨论】:
-
你可以离开大部分 EF 部分,因为你的牛肉是“我如何告诉计算机处理两种相同的类型,它们彼此之间没有任何关系,只是它们是相同的 给我”。假设 TModel 和 TObject 具有相同的属性,您可以使用 AutoMapper 来映射属性。
-
嗨 Janne,这并不完全正确。我知道它们是不一样的,我并不是试图说服计算机将它们视为相同。我想要一个函数来根据传递的泛型返回要用作泛型的数据类型。
标签: c# entity-framework generics data-access-layer business-logic-layer