2017-10-12 38 views
1

我想使用Castle Windsor的裝飾模式爲我的api創建視圖模型,但根據控制器將不同的類注入裝飾器。我有兩個版本的API端點。使用Castle Windsor的裝飾模式,當需要注入不同的類時,取決於調用者

一個用於HomeV1Controller:

public class HomeV1Controller : ApiController { 
    private readonly IHomeViewModelFactory _factory; 

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

和第二:

public class HomeV2Controller : ApiController { 
    private readonly IHomeViewModelFactory _factory; 

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

兩個控制器接受IHomeViewModelFactory其定義是:

public interface IHomeViewModelFactory { 
    HomeViewModel CreateViewModel(); 
} 

現在我想注入公共視圖模型兩個控制器的工廠,工廠需要打電話給下一個競爭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; 
    } 
} 

和兩個特定的控制器:

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; 
    } 
} 

現在HomeV1Controller需要注入了UserViewModelFactory其中有HomeV1ViewModelFactoryHomeV2Controller需要依賴於有注入UserViewModelFactory,其依賴於HomeV2ViewModelFactory

+0

通常情況下,我們不把任何業務邏輯中的ViewModels,因此沒有理由去嘲笑他們還是要回到DI容器創建它們。使用'new'關鍵字就足夠了。查看[本博客文章](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=97)瞭解更多詳情。 – NightOwl888

+0

@ NightOwl888我不會放任何邏輯來查看模型本身。但邏輯我知道如何虛擬機創建。 – mardok

+0

這很好。我的觀點是,沒有理由使用工廠或DI容器來創建視圖模型。在這種情況下你不需要抽象。你看起來很好的代碼(除了不需要的IHomeViewModelFactory構造函數參數)。 – NightOwl888

回答

1

我能想到的唯一的事情就是服務覆蓋:

 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")); 
相關問題