ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何避免ef以上业务逻辑类中的重复代码?

2019-07-10 13:05:36  阅读:199  来源: 互联网

标签:c interface entity-framework abstract-class


我的应用程序中有一个业务逻辑层,用于填充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();我得到一个错误,即图书类未定义,缺少参考.

我不想在我的所有客户端项目中添加对数据层的引用,那么如何处理呢?

解决方法:

您可以创建一个单独的界面,如IService< TData>哪个服务< TEntity,TData>类型工具.然后你可以利用依赖注入,只提供具体的BookService类型作为IService< BookData>的实现.这样您就不必在顶层中引用具体的Book实体,而只需使用BookData即可.

标签:c,interface,entity-framework,abstract-class
来源: https://codeday.me/bug/20190710/1424427.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有