2

ランタイム パラメータを使用してさまざまなオブジェクトが実行時に作成される DI で、オブジェクトの作成を処理する最良の方法は何ですか? 非常にうまく機能する抽象ファクトリの使用に関するMark Seemannの回答を読みましたが、私の質問には、呼び出されるコマンドに応じて異なるビューモデルを作成するために多数の抽象ファクトリが必要になるシナリオが含まれます。

たとえば、次のように記述されたアプリケーションの場合

リポジトリ層

public interface IMainRepository { }
public interface IOtherRepository { }

サービス層

public interface IMainService { }
  public interface IOtherService { }

  public class MainService : IMainService
  {
    public MainService(IMainRepository mainRepository)
    {
      if (mainRepository == null)
      {
        throw new ArgumentNullException("IMainRepository");
      }
      _mainRepository = mainRepository;
    }

    readonly IMainRepository _mainRepository;
  }

  public class OtherService : IOtherService
  {
    public OtherService(IOtherRepository otherRepository)
    {
      if (otherRepository == null)
      {
        throw new ArgumentNullException("IOtherRepository");
      }
      _otherRepository = otherRepository;
    }

    readonly IOtherRepository _otherRepository;
  }

モデルを見る

public class MainViewModel
  {
    public MainViewModel(IMainService mainService, IOtherViewModelFactory otherViewModelFactory)
    {
      if (mainService == null)
      {
        throw new ArgumentNullException("IMainService");
      }
      _mainService = mainService;

      if (otherViewModelFactory == null)
      {
        throw new ArgumentNullException("OtherViewModelFactory");
      }
      _otherViewModelFactory = otherViewModelFactory;

      InitializeCommonds();
    }

    readonly IMainService _mainService;
    readonly IOtherViewModelFactory _otherViewModelFactory;

    public RelayCommand<int> CreateOtherViewModelCommand { get; set; }

    void InitializeCommonds()
    {
      CreateOtherViewModelCommand = new RelayCommand<int>(CreateOtherViewModel);
    }

    void CreateOtherViewModel(int otherId)
    {
      var otherVM = _otherViewModelFactory.Create(otherId);

      //Do other fantastic stuff...
    }
  }

  public class OtherViewModel
  {
    public OtherViewModel(IOtherService otherService, int otherId)
    {
      if (otherService == null)
      {
        throw new ArgumentNullException("IOtherService");
      }
      _otherService = otherService;

      _otherId = otherId;
    }

    readonly IOtherService _otherService;
    readonly int _otherId;
  }

モデル工場を見る

public class OtherViewModelFactory : IOtherViewModelFactory
  {
    public OtherViewModelFactory(IOtherService otherService)
    {
      if (otherService == null)
      {
        throw new ArgumentNullException("IOtherService");
      }
      _otherService = otherService;
    }

    readonly IOtherService _otherService;

    public OtherViewModel Create(int otherId)
    {
      return new OtherViewModel(_otherService, otherId);
    }
  }

CreateOtherViewModelCommandメンバーが から呼び出されるMainViewModelと、抽象IOtherViewModelFactoryファクトリの依存関係を使用してOtherViewModelビュー モデルが作成されます。MainViewModelがこれ以上複雑にならない場合、これは完全に正常に機能します。MainViewModel他のビュー モデル タイプを作成するコマンドが多数ある場合はどうなりますか? 私が理解しているように、それらのために他の抽象ファクトリも作成する必要がありますが、これらの抽象ファクトリの依存関係はすべてコンストラクタインジェクションを介して提供されるため、これはコンストラクタの膨張につながりませんか? さまざまなタイプのビュー モデルを作成するために 10 の異なる抽象ファクトリが必要な場合を想像してみてください。私が達成しようとしていることを実装するより良い方法はありますか? ありがとう。

4

1 に答える 1

1

Ninjectのような IoC コンテナーが役立つポイントに到達しました。具体的な実装をインターフェイスにマップする方法を定義してから、IOC コンテナーにオブジェクトを要求します。適切な実装がすべて提供された状態で、先に進み、オブジェクトを構築します。

于 2013-06-18T14:35:53.103 に答える