0

同僚に継承されているビジネス ロジック操作の基本クラスがあります。objectContextこのクラスは、 as パラメータを必要とするコンストラクタを公開します。この基本クラスは、アトミック CRUD 操作のコンポーネントと考えることができます (すべての選択、挿入、編集、および削除メソッドは、常に 1 つのエンティティに対してのみ機能します)。

objectContext次に、ビジネストランザクションを実行するために上記のすべての基本クラス間で主な目的が共有される「スーパークラス」があり、必要に応じてbaseClassインスタンスを提供する必要があります。

だから、私はスーパークラスをに「注入」するエレガントな方法を探していobjectContextますbaseclass:

public BaseClass<T> where T : entity
{
    private ObjectContext _ctx;
    public BaseClass(ObjectContext ctx){ _ctx = ctx;}
    public virtual IList<T> Select(){..}
    public cirtual voind Insert(T entity){..}
    // other stuff 
}

public class SuperClass
{
    private ObjectContext _ctx = new...
    public BaseClass<TEntity> LoadBaseClass(TBase, TEntity) where TBase : BaseClass<TEntity>, where TEntity : class
    {
        BaseClass<TEntity> obj = Activator.CreateInstance(typeof(TBase), _ctx); // share objectContext
    }
    public int SaveAll(){return _ctx.SaveChanges();}
}

ご覧のとおり、私のスーパー クラスはbaseClassその型を介して何らかのインスタンスを返すことができます。ただし、一部の継承されたクラスが他のパラメーターを使用して独自のコンストラクターを定義している場合、私のLoadBaseClassメソッドは失敗します。

LoadBaseClassメソッドからのインスタンス作成中にエラーが発生する可能性を回避するために、クリーンな解決策を見つけます。私が知っている唯一の方法は、プライベートコンストラクターを定義することですが、この方法では誰も継承できbaseclassなくなります..

4

1 に答える 1

2

あなたが探しているのはDependency Injectionと呼ばれます。あなたは今これを手作業で構築しようとしていますが、あなたが望むことをするツールはすでにたくさんあります。

依存性注入とは、オブジェクトを構築し、それらのオブジェクトを作成する方法とタイミングを構成することです。ビジネスロジックからオブジェクトの作成を分離することになります。

あなたの場合、Unit Of Work and Repositoryパターンと呼ばれるものを使用しています。Ninjectのような依存性注入コンテナーを使用すると、次のUnitOfWorkようにすべてのリポジトリ間で共有されるように簡単に構成できます。

var kernel = new StandardKernel();
kernel.Bind<IMyRepository>().To<ConcreteRepository();
kernel.Bind<IMyUnitOfWork>().To<ObjectContextImp>().InRequestScope();

IMyRepository repos = kernel.Get<IMyRepository>();

Ninject (または任意の DI ツール) が行うことは、IMyRepository. を探すように設定しましたConcreteRepository。次に、がそのコンストラクターConcreteRepositoryで a を取ることに気付きます。IMyUnitOfWorkこの場合、これをにマップし、オプションObjectContextImlを追加しました。InRequestScope

InRequestScopeは ASP.NET Web アプリケーション用であり、リクエストごとに 1 回コンテキストを作成する必要があることを意味します。Ninject には、オブジェクトの作成方法と共有方法を構成するために使用できる、いくつかの異なるオブジェクト スコープがあります。

このようにして、オブジェクトの作成方法を完全に制御できます。

于 2013-04-02T08:11:47.143 に答える