現在、新しいアプリケーション用にデータアクセス層とビジネスロジック層のクラスを構築していますが、質問があります(明らかに)。まず、役立つ可能性のある詳細を次に示します。
- モデルクラスとデータアクセスにEntityFramework5を使用する
- 各「レイヤー」は、異なるクラスライブラリと名前空間(つまり、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のような仮想関数(add、getなど)で使用されます。
そして、私はアイデアを思いつきました-ちょっと待ってください...それは一般的であるため、すべてのモデルにDALクラスを実装する必要はありません。私はこのようなものを書くことができます:
public class GenericDAL<T> : DALBase<T>
{
public GenericDAL() : base() {}
}
...どのモデルにも使用できます。OK、ビジネスロジックレイヤーへと続きます。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クラスは仕事を成し遂げ、開発時間を節約できると思います。
お時間をいただきありがとうございます。