1

は私の不完全なのStructureMap構成である私のために私のアプリを書くためにあなたを求めビッグ謝罪が、私は私が検索を指しグーグル行うとき、私は見つけるとほぼすべてのものを混乱少しするのStructureMap APIを見つけることです古いAPIにasp.net MVC/Linq2SqlコンボでのDIのStructureMap設定?</p> <p>PS:ここ

public static void Configure(IContainer container) 
    { 
     container.Configure(c => 
     { 
      string connectionString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; 
      SQLDataContext dataContext = new SQLDataContext(connectionString); 

      c.For<SQLDataContext>().HttpContextScoped(); 

      c.For<IAdminRepository>().Use<SQLAdminRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 
      c.For<IMemberRepository>().Use<SQLMemberRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 
      c.For<IUtilityRepository>().Use<SQLUtilityRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 

      c.For<IAdminService>().Use<AdminService_v2>(); 
      c.For<IMemberService>().Use<MemberService_v2>(); 
      c.For<IUtilityService>().Use<UtilityService_v2>(); 

      c.For<ResourcePool>().Singleton(); 

     }); 
    } 

各サービスは、そのコンストラクタを介して渡され、対応するリポジトリに依存しています。例えば:

したがって、サービスレイヤーは、実際のリポジトリの背後にあるファサードにすぎません。 [そして、あなたが尋ねる前に、私は急いでそれを変更するつもりはありません。最初は劇的なことをする前に、コードをテスト可能にするようにDIを働かせたいからです。

Q1:アプリケーションLinq2Sqlデータアクセスを使用します。リポジトリ間で行われる複雑なクエリでは、各コントローラに送信されるすべてのサービスが、同じデータコンテキストインスタンスへの依存関係をリポジトリの依存関係に持つことが不可欠です。したがって、データコンテキストにHttpContextライフサイクルを使用したいと考えています。これは(上の)私のやり方ですか?

Q2:シングルトンパターンに従うために使用されたResourcePoolですが、コンストラクタパラメータとして単一のサービスを取る普通のクラスにリファクタリングしました。そうですか?この場合、それはasp.netアプリケーションキャッシュから来たかのように動作しますか?

Q3:リポジトリとサービスの設定に相当する自動登録は何ですか? [PS:はい、私は "_v2"という接尾辞は慣習的ではないが、各XServiceとXRepositoryのレガシー相当品が既に存在していて、DIが追加されてシームレスに作業している間に私の余暇でリファクタリングしたいと思っている。 MVCフレームワークは、それを作成することができるように、すべてのクラスが(例えばAdminDisplayなど)のデフォルトのパラメーターなしのコンストラクタを必要とし、このような場合には

[HttpPost] 
public ActionResult List(AdminDisplay admin) 
{ 
    admin.GetAdminPage(); 
    return View(admin); 
} 

Asp.Net MVCは1つがそうのような強い結合モデルを持つことができます。さらに、そのようなモデル結合クラスの内部で作成されたクラスは、そのようなパラメータのないコンストラクタも必要とする。

Q4:これらのパラメータのないコンストラクタを置き換えたい場合は、StructurMapコンフィグレーションコードでそれらのエントリを追加するだけで十分ですか? - これらのモデルバインディングクラスとその扶養家族のすべてが、StructureMapが解決できるパラメータのみを使用するコンストラクタを持っていれば、それを行う必要はありませんか?

上記のフォーマットが悪いとお詫び申し上げますが、編集をオフにするにはどうすればよいですか?

PS:Q1、Q2、Q3、Q4のいずれかの質問に答えることはできません。

+2

ようこそスタックオーバーフロー。 1つの長い質問ではなく、いくつかの短い質問をすると、回答が得られる可能性が高くなります。さらに、質問のすべて(ただし、すべてではない)に答えることが許されている場合は、どのように回答を選択して受け入れますか? –

+0

Thanks Mark、 上記の最後のPSで述べたように、これらの質問のいずれかに個別に答えてもよい。 – user1040323

+0

私はそれが壊れていると思ったので少し気になりました - しかし、それは代わりに壊れた私の新しいレポ層のものでした! 上記のコードは機能します。 Phew。 主な相違点は、インスタンスを呼び出す前にデータコンテキストの有効期間を設定することです。つまり、 'code' c.For (); HttpContextScoped(); SQLDataContext dataContext =新しいSQLDataContext(connectionString); 'code' – user1040323

答えて

1

Q1:に

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>().Is(dataContext); 

SQLDataContext dataContext = new SQLDataContext(connectionString); 
c.For<SQLDataContext>().HttpContextScoped(); 

に:から各リポジトリの

c.For<SQLDataContext>().HybridHttpOrThreadLocalScoped() 
.Use(() => new SQLDataContext(connectionString)); 

変更コードからデータコンテキストのコードを変更し

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>(); 
関連する問題