3

C# 3.0 の新しいオブジェクト初期化子を見ていて、それらを使用したいと考えています。しかし、Microsoft Unity などでそれらを使用する方法がわかりません。おそらく何か不足していますが、厳密に型指定されたプロパティ名を保持したい場合は、できるかどうかわかりません。たとえば、これを行うことができます(疑似コード)

Dictionary<string,object> parms = new Dictionary<string,object>();
parms.Add("Id", "100");

IThing thing = Factory.Create<IThing>(parms)();

次に、リフレクションを介して Create で何かを実行してパラメーターを初期化します...しかし、新しいオブジェクトの初期化子のように、Create レベルで強く型付けしたい場合は、どうすればよいかわかりません。

より良い方法はありますか?ありがとう

4

6 に答える 6

0

私の知る限り、それは不可能です。この場合、リフレクションは非常に遅く、アプリケーションのボトルネックになりやすいため、リフレクションには近づかないでしょう。これにリフレクションを使用することは、実際にはリフレクションを悪用していると思います。

構文糖衣をエミュレートしたいので、自分を撃たないでください。インスタンスのフィールド/プロパティを 1 つずつ設定するだけで、古典的な方法です。リフレクションよりもはるかに高速です。

注意: 特効薬であるデザイン パターンはありません。ファクトリ メソッドとオブジェクト初期化子は優れていますが、常識を働かせ、実際に意味がある場合にのみ使用してください。

于 2008-11-28T14:32:18.797 に答える
0

私は Unity にあまり詳しくありませんが、IoC/DI の背後にある考え方は、オブジェクトを自分で構築しないということです。そのため、もちろんオブジェクト初期化構文を使用することはできません。

あなたの例で C# 3.0 から使用できるのは、Dictionary ではなく匿名型だと思います。Unityがそれを消費できるかどうかはわかりません.

とにかく、Factory.Create() のような呼び出しを行う場合は、おそらく IoC を間違った方法で使用しています。

于 2008-11-28T14:32:30.870 に答える
0

Unity、Castle、または .net で利用可能なその他の IOC フレームワークの学習に時間を投資することを検討してください。IOC を使用すると、オブジェクトの初期化の複雑さをコードから構成ファイルに移すことができます。アプリケーションでは、インターフェイスを使用して、IOC コンテナーによって初期化されるオブジェクトにアクセスします。IOC が提供するもう 1 つのサービスは、オブジェクト (シングルトンなど) の有効期間の制御です。

于 2008-11-28T15:30:06.933 に答える
0

Graham 氏によると、IoC/DI の背後にある考え方は、コンポーネントが依存関係をコンストラクター パラメーターまたは特定の型 (通常はインターフェイス) のパブリック プロパティとして宣言することです。次に、コンテナーは依存関係グラフを作成し、それらを満たします (Castle Windsor のような成熟した IoC の場合のコンポーネントのライフスタイルに関して)。

したがって、基本的には、コンポーネントを記述し、依存関係を状態にしてから、コントラクトと実装を IoC コンテナーに登録すれば、オブジェクトの構築はもう気にしません。Application.Start() のような単一の呼び出しを行うだけです:)

悪い点は、一部のフレームワークは統合が難しいことです。ASP.NET WebForms と同様に、IHttpHandler の作成を制御できず、IoC を使用してそれらをインスタンス化するファクトリをセットアップできません。このような環境でIoCを使用するのに最適なAyendeの「Rhino Igloo」を確認できます.

于 2008-12-01T16:22:24.470 に答える
0

This is answered better in this question: Is it possible to use a c# object initializer with a factory method?.

There were four possibilities:

  • Accept a lambda as an argument
  • Return a builder instead
  • Use a default constructor, passing in an initialized object
  • Use an anonymous object
于 2010-09-19T00:03:18.753 に答える