【问题标题】:How to avoid duplicate code in business logic classes above ef?如何避免 ef 以上业务逻辑类中的重复代码?
【发布时间】: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


【解决方案1】:

您可以创建一个单独的接口,例如 IService&lt;TData&gt;,它将实现 Service&lt;TEntity,TData&gt; 类型。然后你可以利用依赖注入并提供具体的BookService 类型作为IService&lt;BookData&gt; 的实现。这样,您根本不必在顶层引用具体的 Book 实体,只需使用 BookData

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2021-11-27
    • 2013-12-21
    • 2014-07-06
    • 2016-09-26
    • 2020-08-12
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多