2017-10-12 37 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")); 
相关问题