В настоящее время я создаю классы уровня доступа к данным и уровня бизнес-логики для нашего нового приложения, и у меня есть вопрос (очевидно). Во-первых, вот некоторые детали, которые могут помочь:
- Использование Entity Framework 5 для классов модели и доступа к данным
- Каждый «слой» разделен на разные библиотеки классов и пространства имен (например, App.Model, App.DAL, App.BLL).
Начав с DAL, я решил написать базовый класс для наследования всех классов DAL.
public abstract class DALBase<T> : IDisposable
{
protected AppEntities context;
protected DbSet set;
public DALBase()
{
context = new OECCORPEntities();
set = context.Set(typeof(T));
}
protected virtual void Save()
{
context.SaveChanges();
}
public virtual void Add(T model)
{
set.Add(model);
Save();
}
public virtual T Get(int id)
{
return (T)set.Find(id);
}
public virtual List<T> GetAll()
{
return set.OfType<T>().ToList();
}
public virtual void Delete(int id)
{
T obj = Get(id);
set.Remove(obj);
Save();
}
public virtual void Update()
{
Save();
}
public void Dispose()
{
context.Dispose();
}
}
Как вы увидите, базовый класс реализует универсальный тип, который должен быть типом модели, за работу с которой отвечает класс DAL. Используя универсальный тип, в конструкторе он создает DbSet, используя тип универсального аргумента, который используется в предопределенных CRUD-подобных виртуальных функциях ниже (добавление, получение и т. Д.).
И тогда у меня возникла идея - подожди минутку ... поскольку он общий, мне действительно не нужно реализовывать классы DAL для каждой отдельной модели. Я могу написать что-то вроде этого:
public class GenericDAL<T> : DALBase<T>
{
public GenericDAL() : base() {}
}
... которую я могу использовать для любой из моделей. Хорошо, перейдем к уровню бизнес-логики. Я также создал базовый класс для BLL:
public abstract class BLLBase<T>
{
protected GenericDAL<T> dal;
public BLLBase()
{
dal = new GenericDAL<T>();
}
public virtual void Add(T model)
{
dal.Add(model);
}
public virtual T Get(int id)
{
return dal.Get(id);
}
public virtual List<T> GetAll()
{
return dal.GetAll();
}
public virtual void Delete(int id)
{
dal.Delete(id);
}
public virtual void Update()
{
dal.Update();
}
}
... который использует GenericDAL для выполнения своей работы. Таким образом, я просто написал класс GenericBLL, который выглядит так:
public class GenericBLL<T> : BLLBase<T>
{
public GenericBLL() : base() { }
}
А чтобы проверить это, простое консольное приложение:
class Program
{
static void Main(string[] args)
{
GenericBLL<ADMIN> bll = new GenericBLL<ADMIN>();
List<ADMIN> admins = bll.GetAll();
}
}
... где "ADMIN" - это тип модели. Работает как шарм.
Идея заключалась в том, чтобы избежать необходимости писать классы DAL / BLL для каждой отдельной модели, если только это не требует дополнительных функций. Может кто-нибудь сказать мне, почему я НЕ БУДЕМ делать это таким образом? Я думаю, что общие классы DAL / BLL выполнят свою работу, а также сэкономят время разработки.
Спасибо за уделенное время.