В моем приложении есть уровень бизнес-логики, который инкапсулирует работу с 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();
Я получаю ошибку, что класс книги не определен, отсутствует ссылка.
Я не хочу добавлять ссылки на слой данных во всех моих клиентских проектах, так как с этим бороться?