Как избежать дублирования кода в классах бизнес-логики над ef? - PullRequest
0 голосов
/ 24 января 2019

В моем приложении есть уровень бизнес-логики, который инкапсулирует работу с EF.

У меня есть тонны классов обслуживания, которые предоставляют доступ к базе данных и имеют подобные методы, поэтому я хочу избежать дублирования.

Первый пример:

xData классы - это классы DTO для x класса, сгенерированного EF.

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(); Я получаю ошибку, что класс книги не определен, отсутствует ссылка.

Я не хочу добавлять ссылки на слой данных во всех моих клиентских проектах, так как с этим бороться?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете создать отдельный интерфейс, такой как IService<TData>, который будет реализовывать тип Service<TEntity,TData>. Тогда вы можете использовать внедрение зависимостей и просто предоставить конкретный тип BookService в качестве реализации IService<BookData>. Таким образом, вам вообще не нужно ссылаться на конкретную сущность Book в ваших верхних слоях, и вы можете просто работать с BookData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...