2017-08-16 2 views
1

現在、EntityFrameworkCore 2.0.0を使用しています。エンティティフレームワークオブジェクトに対応する非データベースクラスを追加します。

私が作成しているアプリケーションは、オンラインストア製品のスクレーパーです。すべてのストアはデータベースに保存され、各ストアにはIStoreScraperを実装するスクレーパーがあります。

これは私の店のモデルである:データベースからフェッチされるとStoreオブジェクトへの正しいIStoreScraperオブジェクトを追加することが可能である場合、私は思っていた

public class Store 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [NotMapped] 
    public IStoreScraper StoreScraper { get; set; } 
} 

。データベースからの値か他の何かによって。

これもモデルのコンストラクタに挿入する方法を検討しましたが、これはそれぞれのクラスには既に知られている実装があるため、Dependency Injectionパターンに違反します。

多分、私はこのコードをモデルクラスに入れてはいけないので別の観点から見るべきでしょうか?何か案は?

答えて

0

この回答に記載されているように、オブジェクトのマテリアライズされたイベントをオーバーライドしてここに追加することができます。

How to Inject Helper Dependencies in Domain Model Entity Classes

は、しかし、私は非常にこの反対をお勧めします。 EFはデータモデルであることを前提としていますので、このような依存関係を追加するための適切な場所であるビジネスレイヤーが必要です。

+0

さて、Storeオブジェクトを与える 'StoreFacade'クラスを作って、これが様々なスクレーパーとの通信を処理するとしたら、各クラスの正しいスクレーパーを得るにはどうすればよいでしょうか? – Jerodev

+0

あなたの要件に完全に依存していますが、答えが広すぎるのです...これは、データベースに格納されている値に依存する可能性があります。この場合、ディクショナリからデータベースから値を渡すか、それ以外の方法でそれを割り当てるかのいずれかで、適切なスクレイパーを検索するだけです...これに対しても、あなたのEFモデルのレイヤーのontopですが、このアプローチはうまくいくはずです... – Milney

+1

実際にエンティティに対してIStoreScaperを保存する必要がありますか?これは、スクレイピングを実行するメソッド(または、理想的には、スクレイピングを実行するサービスへの依存関係)に引数として渡す必要があります。つまり、任意の速度 - ストアドメインオブジェクトよりも高いレベルです。私は真剣にあなたのデザインを考え直すことを検討するだろう – Milney

関連する問題