2017-10-12 9 views
1

Castle Windsorを使用してデコレーターパターンを使用して、私のAPIのビューモデルを作成します。 apiエンドポイントの2つのバージョンがあります。 HomeV1Controllerためキャスターウィンザーを使用したデコレーターパターン呼び出し元に応じて異なるクラスを注入する必要がある場合

ワン:

public class HomeV1Controller : ApiController { 
    private readonly IHomeViewModelFactory _factory; 

    public HomeV1Controller(IHomeViewModelFactory factory) { 
     _factory = factory; 
    } 
} 

と第二:

public interface IHomeViewModelFactory { 
    HomeViewModel CreateViewModel(); 
} 

今私は、共通のビューモデルを注入したいと思います:

public class HomeV2Controller : ApiController { 
    private readonly IHomeViewModelFactory _factory; 

    public HomeV2Controller(IHomeViewModelFactory factory) { 
     _factory = factory; 
    } 
} 

両方のコントローラはそれが画成IHomeViewModelFactoryを受け入れます両方のコントローラの工場とその工場は次のコールを呼び出す必要がありますコントローラに固有のwモデルファクトリです。だから私は工場があります。

共通:

public class UserViewModelFactory : IHomeViewModelFactory { 
    private readonly IHomeViewModelFactory _factory; 

    public UserViewModelFactory(IHomeViewModelFactory factory) { 
     _factory = factory; 
    } 

    public HomeViewModel CreateViewModel() { 
     var vm = _factory.CreateViewModel(); 
     vm.User = new User(); 
     return vm; 
    } 
} 

とコントローラのための具体的な2:

public class HomeV1ViewModelFactory : IHomeViewModelFactory { 
    public HomeViewModel CreateViewModel() { 
     // logic only for V1 to create vm 
     var vm = new HomeViewModel { 
      Articles = new Articles() 
     }; 
     return vm; 
    } 
} 

public class HomeV2ViewModelFactory: IHomeViewModelFactory { 
    public HomeViewModel CreateViewModel() { 
     // logic only for V2 to create vm 
     var vm = new HomeViewModel { 
      Issues = new Issues() 
     }; 
     return vm; 
    } 
} 

を今HomeV1ViewModelFactoryHomeV2Controllerの依存関係を持つUserViewModelFactoryを注入したのはHomeV1Controllerニーズが持っている必要がありますHomeV2ViewModelFactoryの依存性を有する注入されたUserViewModelFactoryである。私は考えることができる

+0

入れていないため、それらを模擬するため、または背面にDIコンテナに行くことに理由はありませんそれらを作成します。 'new'キーワードを使うだけで十分です。詳細については、[このブログの投稿](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=97)を参照してください。 – NightOwl888

+0

@ NightOwl888私はモデルそのものを見るためにどんな論理にも入れません。しかし、私はVMがどのように作られているかを論理的に説明します。 – mardok

+0

それはいいです。私のポイントは、ビューモデルを作成するために工場またはDIコンテナを使用する理由がないということです。このシナリオでは、抽象概念は必要ありません。あなたが持っているコードは、( 'IHomeViewModelFactory'の不要な' constructor 'パラメータを除いて)素晴らしいです。 – NightOwl888

答えて

1

だけの事は、サービス上書きされます。一般的に、我々はのviewmodels内の任意のビジネスロジックを

 container.Register(Component.For<HomeV1Controller>() 
      .DependsOn(Property.ForKey<IHomeViewModelFactory>().Is("UserViewModelFactory1"))); 
     container.Register(Component.For<HomeV2Controller>() 
      .DependsOn(Property.ForKey<IHomeViewModelFactory>().Is("UserViewModelFactory2"))); 

     container.Register(Component.For<IHomeViewModelFactory>() 
      .ImplementedBy<UserViewModelFactory>() 
      .Named("UserViewModelFactory1") 
      .DependsOn(Property.ForKey<IHomeViewModelFactory>().Is("HomeV1ViewModelFactory"))); 

     container.Register(Component.For<IHomeViewModelFactory>() 
      .ImplementedBy<UserViewModelFactory>() 
      .Named("UserViewModelFactory2") 
      .DependsOn(Property.ForKey<IHomeViewModelFactory>().Is("HomeV2ViewModelFactory"))); 

     container.Register(Component.For<IHomeViewModelFactory>().ImplementedBy<HomeV1ViewModelFactory>().Named("HomeV1ViewModelFactory")); 
     container.Register(Component.For<IHomeViewModelFactory>().ImplementedBy<HomeV2ViewModelFactory>().Named("HomeV2ViewModelFactory")); 
関連する問題