2017-08-29 8 views
0

DbContextを使用して製品を追加および挿入するプロダクトロジッククラスがあります。StructureMap - EF別のクラスからの変数で初期化

また、ProductImporterクラスのファイルから製品のリストをループし、ProductクラスのaddProductを呼び出します。トランザクションでこれが行われ、すべての製品が追加されるか、またはすべてが追加されます。擬似は以下にあります。

製品クラスには2つのコンストラクタがあります。 dbcontextを取り込む最初のものと、新しいdbcontextを初期化するものです。私はトランザクションを有効にするためにProductImporterからDbContextを渡す最初のコンストラクタを使用します。

var dbContext... 

ImportProducts() { 

    Product p = new Product(dbContext); 

    dbContext.BeginTransaction 


    While(moreProducts) 

     p.addProduct(); 


    End transaction 

} 

私の質問は:アプリが一つの製品を追加する必要があるときに、製品クラスの新しいインスタンスを注入

  1. :どのように私は2例を満たすために、構造マップを使用することができます。

  2. 上記のImportProductsメソッドのProductクラスに同じDbContextを使用するように注入します。効果的には、下の行を構造マップにプロダクトクラスを挿入し、DbContextProductImporterクラスと同じにするように置き換えます。

    Product p = new Product(dbContext); 
    

感謝。

答えて

0

あなたのクラスのコードがなければ私は推測できますが、データクラスとロジック/サービスクラスを混在させているようです。これはメンテナンスが難しく、実装が難しい問題につながります。あなたは経験している)。

私の提案は、あなたの製品クラスにはデータだけを保持させることです。論理は全くありません。 リポジトリパターンを使用してこれを行うことができます。 http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/

上記のリンクを読んで、パターンを研究してください - それはあなたに多くの時間と頭痛を節約します。パターンを十分に理解している場合は、汎用リポジトリをチェックすると、さらに時間を節約でき、コードの管理が容易になります。

ここで重要な点は、データ/エンティティ/モデル用に別のクラスがあり、ロジック/ services /(データベースで作業中)用に別のクラスがあることです。

この場合、リポジトリにDbContextが注入され、リポジトリをインポータに注入する必要があります。例えば

これはテストされていないとアドリブコードです。私はその解決策の例を提供しようとしています。

public class ProductImporter 
{ 
    private readonly IProductRepository _productRepository;  

    public ProductImporter(IProductRepository productRepository) 
    { 
     this.__productRepository = this._productRepository; 
    } 

    public void AddProducts(IEnumerable<Product> products) 
    { 
     foreach(var product in products) 
     { 
      this._productRepository.Add(product); 
     } 
    } 
    ... 
} 
関連する問題