【发布时间】:2019-06-17 22:12:16
【问题描述】:
我的应用程序中有一个业务逻辑层,用于封装与 EF 的工作。
我有大量的服务类提供对数据库的访问并且有类似的方法,所以我想避免重复。
第一个例子:
xData 类是 EF 生成的 x 类的 DTO 类。
public class UserService
{
public static bool Any()
{
// default logic
}
public static List<UserData> Filter(Expression<Func<UserData, bool>> predicate)
{
// default logic
}
public static long CreateOrUpdate(UserData userData)
{
// default method with custom logic
}
public static bool AuthorizeUser(UserData data)
{
// custom method
}
}
public class BookService
{
public static bool Any()
{
// default logic
}
public static List<BookData> Filter(Expression<Func<BookData, bool>> predicate)
{
// default logic
}
public static long CreateOrUpdate(BookData userData)
{
// default logic
}
}
主要问题:重复逻辑在大多数方法中,只有类型不同。
第二个例子:
我创建了一个包含所有共享逻辑的通用服务。
public abstract class Service<TEntity,TData> where TEntity : class
where TData : IDataObject<TEntity>, new()
{
public static bool Any()
{
// default logic
}
public static List<TData> Filter(Expression<Func<TData, bool>> predicate)
{
// default logic
}
public static long CreateOrUpdate(TData data)
{
// default logic
}
}
所以我的自定义服务现在看起来像这样:
public class UserService : Service<user, UserData>
{
public new static long CreateOrUpdate(UserData userData)
{
// overriden custom logic
}
public static AuthorizeUser(UserData userData)
{
// custom method
}
}
public class BookService : Service<book, BookData>
{
}
现在一切看起来都很好,但是在那之后我所有使用业务逻辑层的项目都需要对数据层的引用,因为他们不知道数据类型,例如当我尝试使用 BookService.Any(); 时,我收到一个错误,即图书类未定义,缺少参考。
我不想在我的所有客户端项目中添加对数据层的引用,那么如何处理呢?
【问题讨论】:
-
您应该将所有实体类放入一个单独的域项目并引用它
-
@AmanB 实体类已经在单独的项目中,我不想引用那个单独的项目,我只想引用客户端项目中的业务逻辑层
-
@Bobo 我这里不需要存储库模式,EF 使用 dbcontext 和 dbsets 提供了足够的抽象
标签: c# entity-framework interface abstract-class