2

私はEntity Framework Database Firstの使用を検討しており、エンティティに動作を挿入する必要があるかどうかを理解しようとしています。そうであれば、これを行うための最良の手法は何ですか. 私は通常、貧血ドメインオブジェクトを避けるために過去にこれを行ってきました. いくつかの使用例は、仕様をエンティティに注入する場合 (仕様パターン/構成可能なビジネス ルールを定義する)、または ninject 実装されたファクトリをルート エンティティに注入する場合で、実装のバインディングが戦略/ファクトリ メソッドによって決定される場合です。使用点) したがって、以下の例では、IOC を使用して ISomethingSpec 実装に挿入します。

 class Foo
 {
    void DoSomething()
    { 
        if(somethingSpec.SatisfiedBy(this)
        {
        }
    }
}

エンティティと動作を関連付ける別のパターンを検討する必要がありますか? または、合理的であれば、最初にデータベースでEF5を使用している場合、部分クラス/プロパティおよびメソッド注入を使用するのが最良のオプションですか?

これは私の最初の投稿なので、形式があまり的外れでないことを願っています。同様の他の質問を見たので投稿しましたが、動作をドメイン オブジェクト/EF エンティティに関連付けるためのベスト プラクティスについてのコンセンサスを判断できませんでした。

4

2 に答える 2

4

Entity Frameworkで仕様パターンを使用して、データベースから取得されるデータをフィルタリングします。同じアプローチを使用して、ニーズに適合させることができると思います。

DIコンテナを使用して、仕様やその他の必要なオブジェクトを注入できます。最初のステップは、次のような仕様オブジェクトのコントラクトを定義することです。

public interface ISpecification<T> where T : class
{
    Expression<Func<T, bool>> GetExpression();
    bool IsSatisfiedBy(T entity);
}

一般的な仕様オブジェクトは、次のように定義できます。

public class Specification<T> : ISpecification<T> where T : class
{
    private Expression<Func<T, bool>> expression;

    public Expression<Func<T, bool>> GetExpression()
    {
        return expression;
    }

    public Specification(Expression<Func<T, bool>> expression)
    {
        this.expression = expression;
    }

    public bool IsSatisfiedBy(T entity)
    {
        var query = (new[] { entity }).AsQueryable();

        return query.Any(this.expression);
    }
}

次に、Fooクラスを次のように変更できるため、DI/IoCコンテナーを使用して依存関係を注入できます。

public class Foo()
{
    public ISpecification<Foo> Specification 
    {
        get;
        private set;
    }

    public Foo(ISpecification<Foo> specification)
    {
        this.Specification = specification;
    }

    public void DoSomething()
    { 
        if(Specification.SatisfiedBy(this))
        {
            //...
        }
    }
}

仕様の作成と使用:

// example - create one specification
Expression<Func<Foo, bool>> expression =  ....;  
ISpecification<Foo> fooSpecification = new Specification<Foo>(expression);


// using the specification with linq
var entities = dbContext.Foos.Where(fooSpecification.GetExpression());


// performing validation
var foo = new Foo{
    // ....
};

if(fooSpecification.IsSatisfiedBy(foo))
{
    // do something....
}

詳細はこちら:

http://ruijarimba.wordpress.com/2011/06/05/entity-framework-and-t4-generate-specification-objects-for-your-entities/

于 2013-02-17T19:38:24.803 に答える
2

この質問に関して、Rui の有益なコメントに続くいくつかの調査の結果、エンティティにサービスを注入するという私の意図には欠陥があると結論付けました。したがって、私の元の質問に対する答えは、代わりにドメイン イベントを使用してカップリングを大幅に減らすか、代わりに以下のリンクのように「ダブル ディスパッチ」を使用することです。私は現在、nServiceBus をドメイン イベントを実装する技術として (および nServiceBus 自体への導入として) 検討しています。

次の記事は、サービスの種類とドメイン モデルでの使用方法についての私の考えを明確にするのに役立ちました。

ドメイン イベントの救済

于 2013-02-23T15:45:34.413 に答える