0

ビジネスオブジェクトをインスタンス化するために、この種のパターンをコードに入れました。

// UI or Business level code
public class SomeClass
{
    IOrderFactory orderFactory;

    public SomeClass(IOrderFactory orderFactory)
    {
        this.orderFactory = orderFactory
    }

    public void SomeMethod()
    {
        var newOrder = orderFactory.CreateOrder();
        // Do stuff with new object        
    }
}

// In an interfaces only project
public interface IOrderFactory
{
    Order CreateOrder();
}

// In an implementation project (not seen by most other modules)
public class OrderFactory
{
    public Order CreateOrder()
    {
        return new Order();
    }
}

現在、Unityを使用してIOrderFactoryオブジェクトを作成していますが、Unity(IOC)を使用してOrderオブジェクト自体を生成できるかどうか疑問に思っています。

何かのようなものunityContainer.Resolve<IOrder>()で、毎回新しいものを作りますか?

それはうまくいくでしょうか?サービスと機能(つまり、ViewModels、Helpers)クラスにはUnityを使用します。ただし、これを使用してビジネスオブジェクト(顧客や注文など)を作成したことはありません。

4

3 に答える 3

3

私の意見では、これはすべて、特定のオブジェクト (つまり、WizBang) のインスタンスを構築するのがどれほど複雑か、およびそれがどのくらいの頻度で変更されるかに依存します。

IWizBang の実装が常に WizBang である場合、または WizBang インスタンスの作成にデフォルト コンストラクターの呼び出しのみが含まれる場合、IOC コンテナーの導入はやり過ぎです... メソッドを生成するファクトリ メソッドを簡単に作成できます。開発者は、構成の複雑さが、プロジェクトに不慣れな開発者や、構成が必要な新しいエンティティを頻繁に追加する必要がない開発者にとっても負担になる可能性があることを忘れがちです。

于 2012-11-09T17:11:12.750 に答える
1

IOrderFactoryを保持します。DIコンテナはサービスを提供するのに優れていますが、エンティティ(特定のオブジェクトIDが重要なもの)が必要な場合、コンテナの使用には問題が生じることがよくあります。

私がこれを行う理由はいくつかあります。

  1. エンティティを作成するには、そのエンティティのデータ(注文ID、広告申込情報など)が必要になる傾向があります。これらのデータは、作成するたびに異なります。これは、コンテナで行うのが難しく、厄介になります。
  2. これを行うには、コンテナインスタンスをビジネスロジックに指定する必要があります。コンポジションルートを除いて、コードがコンテナに直接依存することは本当に望ましくありません。私の経験では、多くのIUnityContainer依存関係を確認することは警告サインです。

ただし、コンテナを利用することはできます。IOrderFactoryを依存関係として保持してから、ファクトリをコンテナに挿入します。次に、注文を作成するために必要なサービスをファクトリ自体に注入して保持することができます。コンテナを工場に注入することもできます。

別のオプションは、構成したものを超える特別なパラメーター値なしで注文を作成できる場合は、Func(ファクトリー関数)を注入することです。これは実行時にコンテナによって生成され、container.Resolveが呼び出されたときにコールバックされます。より多くのパラメーターまたは制御が必要な場合は、おそらくそこから始めてIOrderFactoryを構築できますか?

于 2012-11-11T08:30:43.523 に答える
1

新しい答え

実際、ビルダープレート コードを削減できます。ドメイン クラスは、他のクラスと変わりません。ファクトリ クラスを使用する代わりに、インターフェースから具象型へのマッピングを登録し、必要に応じて ctor パラメーターを提供できます。http://msdn.microsoft.com/en-us/library/ff648211.aspxを参照してください。

古い答え

コンテナーを介してオブジェクトを解決すると、仮想メソッドを呼び出してコンストラクターを呼び出すよりも常に遅くなります。DI コンテナーのメリットが得られるのは、生のパフォーマンスではありません。

于 2012-11-09T17:04:07.497 に答える