問題タブ [structuremap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - StructureMap 作成インスタンス
起動時に構成されたインターフェイスの具象型がありますが、プロパティを設定するか、コンストラクターで異なる値を設定して、実行時に具象型のインスタンスを作成したいと考えています。私が見るすべてのインスタンスの作成は、具象型が何であるかを知っていますが、実行時には具象型がわかりません。具体的な型を知らなくても、インターフェイス/クラスの具体的なインスタンスを作成する方法はありますか? これは私が見たものです:
また:
私は似たようなことをしたい...しかし、具象型がわからない....抽象クラスまたはインターフェースのみ(この場合はプロパティを持つ)。ただし、具体的なタイプは構成されています。
c# - StructureMap で InstanceScope.HttpSession を使用するにはどうすればよいですか?
StructureMap の InstanceScope.HttpSession 機能を使用しようとしていますが、問題が発生しています。テストに使用している次の方法があります。
私の RepositoryRegistry クラスは次のようになります。
したがって、クライアント コード (ASP.NET MVC コントローラー) では、次のようなことを行います。
そして、同じセッションからでもこのコントローラーを呼び出すたびに、毎回新しいインスタンスを取得します。ここで何が間違っていますか?
c# - asp.net mvcでビューエンジンを利用した構造マップを作成する方法
私のビューは、作成した基本ビュー クラスを拡張します。
現時点では、このクラスのコンストラクター内で ObjectFactory.GetInstance を呼び出して、いくつかのインターフェイスの実装を取得していますが、構造マップを使用してそれらをコンストラクターの引数として挿入したいと考えています。
コントローラーを作成するために structuremapcontrollerfactory を使用していますが、ビューに対して同じことを行うにはどうすればよいですか?
カスタムViewEngineを実装できることはわかっていますが、リフレクターを使用してmvcのデフォルトのviewengineとその依存関係を確認すると、それは延々と続いているようで、すでにあるものを再実装する必要はありません。これを解決する狡猾なアイデアを持っている人はいますか?
コンストラクター注入の代わりにセッターを使用して物事を簡単にできることはわかっていますが、可能であればそれを避けてください。
structuremap - StructureMap チュートリアル
構造マップのチュートリアルを探しています。
誰か知っていますか?
編集: すべての回答は大歓迎ですが、Google の最初の 2 ページにないものを探していました。私は最初にそれをする意味があります。
constructor - StructureMap プロファイルを定義するときにコンストラクター引数を構成する方法
デフォルト インスタンスの ctor 引数を必要とする型のバインディングを定義する場合、その方法は非常に明確です。ただし、別のプロファイルを作成したい場合は、少し難しくなります。
これは、デフォルトのインスタンスに対してどのように行われるかです:
これは、私がプロファイルで立ち往生しているところです:
このプロファイルの型マッピングを設定するにはどうすればよいですか?
インスタンスバインディングを使用する必要がありますか (ctor 引数にデフォルト値を渡すことができます)?
c# - StructureMapで非プリミティブ型をインターフェースにラップせずに注入する
IDynamicValueのすべてのインスタンスを構成している単純なSMレジストリがあります。非プリミティブ型(私の場合はDateTimeとPredicate Of T)であるいくつかのコンストラクター引数があります。インターフェイスを使用してクラスにラップすることなく、これらを注入できる方法はありますか(自動配線できるように)。次のコードスニペットは、私が達成したいことを示しています。
その例は実行されますが、例外を除いて失敗します。
StructureMap例外コード:202PluginFamilySystem.DateTimeにデフォルトインスタンスが定義されていません
ありがとう、ニック
編集:
Freddy Riosのソリューションは、私が必要としていたものにぴったりでした。いくつかのコンストラクター引数を自動配線している場合にこれを行う方法があるかどうかはまだ興味があります(したがって、ConstructedBy()を使用できませんでした)
asp.net-mvc - StructureMap / ASP.MVC / Visual Studio / LinqToSql での奇妙な動作
最近、StructureMap で新しい MVC フレームワークを使用しており、全体的には良い結果が得られていますが、理解できない、または解決方法がわからないという非常に奇妙なエラーが発生し続けています。
これは私のアーキテクチャです:
- DBContext - linqToSql データ コンテキスト。
- IRepository - データ メソッドを定義するコントラクト。
- IService - サービス メソッドを定義するコントラクト。
- コントローラー - この例では 2 つ。
したがって、私は持っています:
StructureMap は IRepository と IService の具象型を定義するために使用され、DBContext はラムバ式 () => DSL レジストリによって構成された新しい DBContext() によって構築されます。
現在、DBContext のキャッシュはありません
問題に:
インデックス ページが読み込まれ、ControllerOne と ControllerTwo に対して 2 つの同時 Ajax 要求が作成されます。これらは、MvcContrib の StructureMap コントローラー ファクトリを介して構築されます。
StructureMap は、構成された IRepository インスタンスと新しい DBContext オブジェクトを使用して作成される IService の具象型を注入します。
ControllerOne は IService インスタンスからモデルを要求しています。これは、Newtonsoft.Json によってレンダリングされる JsonActionResult として返されます。
ControllerTwo は IService インスタンスから別のモデルを要求しています。これは、MVC フレームワークが ActionResult を実行するときに Json オブジェクトにシリアル化されます。
VS2008 で Cassini 経由で Web サイトを実行しています。
私が時々見ている問題は、LinqToSql 内から生成されたエラーです。
- データを読み取ることができないか、リーダーがすでに開いているか、
- データが既に存在するため、データ テーブルにデータを読み込むことはできません (現時点では正確な例外はありませんが、どちらも LinqToSql の内部にあります)。
ControllerOne でエラーが発生した場合、ControllerTwo も同様のエラーで失敗し、2 つの要求が共有オブジェクトで実行されているかのようになります。
常にエラーが発生するわけではありませんが、自分のアーキテクチャと、何らかの方法で構成が間違っていることを心配するには十分です。
StructureMap が後続のリクエストで ControllerOne と ControllerTwo の同じインスタンスを返す方法はありますか、または何らかの方法で DBContext をキャッシュしている場合はありますか? 頼んでないのに?
Visual Studio / Cassini 内で作業しているときに、似たようなことを見た人はいますか? IIS を使用することは役に立ちますか?
LinqToSql を削除する必要がありますか?
Visual Studio を閉じて再度開くと、問題がしばらく解決することがよくあります。
誰かが問題に光を当てることができれば、どうもありがとう。
編集: NLog ログ ファイルからのログ スニペットを含めます (スレッド ID はセミコロンの前の数字です):
asp.net-mvc - 構造マップInstanceScope.Hybridとasp.netmvcの誤動作
私は本当にここで立ち往生しています。
asp.net mvcアプリケーションがあり、StructureMap 2.5.3(SM)を使用してコントローラーにサービスクラスとリポジトリクラスを挿入しています。すべてのコントローラーはSM工場で製造されています。
ハイブリッドでキャッシュしたいLinqtoSQLデータコンテキストもあります。
キャッシングが機能していないようで、そのためにデータコンテキストに問題が発生します。
複数のブラウザリクエストはすべて同じdbcontextを返しますか?!私のリポジトリクラスの1つに、このコードを配置しました。Debug.WriteLine( "db hashcode:" + db.GetHashCode()+ "" + DateTime.Now.ToString());
ここで、db = the datacontextまた、dbを使用してリポジトリのハッシュコードを出力し、リポジトリを使用してサービスを出力します。これは、複数のリクエストの出力です。
サービスハッシュコード:6238792 26-3-2009 18:59:34
リポジトリハッシュコード:21756593 26-3-2009 18:59:34
dbハッシュコード:7043935 26-3-2009 18:59:34
サービスハッシュコード:59389065 26-3-2009 18:59:34
リポジトリハッシュコード:8331620 26-3-2009 18:59:34
dbハッシュコード:7043935 26-3-2009 18:59:34
サービスハッシュコード:11291358 26-3-2009 18:59:38
リポジトリハッシュコード:13848497 26-3-2009 18:59:38
dbハッシュコード:7043935 26-3-2009 18:59:38
サービスハッシュコード:42509361 26-3-2009 18:59:38
リポジトリハッシュコード:56101068 26-3-2009 18:59:38
dbハッシュコード:7043935 26-3-2009 18:59:38
ご覧のとおり、7043935はリクエストごとに毎回データコンテキストのハッシュコードですが、サービスとリポジトリは毎回新しいインスタンスとハッシュコードを取得します。
これが原因で奇妙なエラーが発生します。たとえば、データベースが別のソースによって変更されているときに、dbcontextが4つのwebrequests前の元の値を持っているためにデータ同時実行例外が発生します。
c# - 特定の場合にStructureMapを使用してコンストラクターに異なるオブジェクトを挿入します
IRepository <T>と、実装SqlRepository<T>があります。SqlRepositoryには、コンストラクターにDataContextパラメーターがあります。
SM構成は次のようになります。
しかし、IRepository <SpecificObject>の構築のために、異なるDataContextを挿入したいと思います。IReposiotry <SpecificObject>を要求するときに、FirstDataContextではなくSecondDataContext(DCが別のデータベースに移動する)ではなく、別のDataContextが必要であるとSMをどのように言いますか。
たとえば、IRepository <T>を要求する場合は、FirstDataContextを注入しますが、IRepository <Product>を明示的に要求する場合は、SecondDataContextを注入します。
また、そのSecondDCはSMによってハイブリッドキャッシュされる必要があります!
c# - Ninject (またはその他のコンテナー) を使用して、サービスを要求しているタイプを見つけるにはどうすればよいですか?
サービスのインターフェースがあるとします。
そして、ジェネリックであるそのサービスの具体的な実装:
そして、IFooService のインスタンスを必要とする他のクラスがあります。
Bar が作成されたときに FooService<Bar> のコンストラクター引数が渡されるように、IoC コンテナーを接続する必要があります。Bar と同じように、他にも多くのクラスがあります。また、それぞれに FooService<TRequestingClass> のインスタンスを渡す必要がある場合もあります。ここで、TRequestingClass は、IFooService のインスタンスを必要とするクラスの型です。この奇抜さを IFooService の消費者に公開する必要はありません。彼らが気にする必要があるのは、渡された IFooService のメソッドを呼び出すことができるということだけです。渡された IFooService の具体的な実装を構築するために特別なものが必要であることを知る必要はありません。
FooService<T> の代わりとして受け入れられるのは、作成対象のクラスの名前を含む文字列引数をコンストラクターに持つ非ジェネリック クラスです。すなわち:
このように IoC コンテナーを接続して依存関係を構築するにはどうすればよいですか?
なぜこのような奇妙な構造が必要なのか混乱している場合は、log4net.LogManager.GetLogger(typeof(SomeClass)) で作成された ILog を取得するときに log4net がどのように機能するかを検討してください。コードに log4net への参照を散らかしたくないので、単純な ILogger インターフェイスを作成し、次のように実装したいと思います。