很多时候,我们定义了一个接口,但是这个接口会有多种不同的,这时IOC构造函数注入的时候,就需要自动选择对应的实现。
public interface ITestService {} public class TestService : IService { public string test() { return "test" } } public class TestService_New : ICalculatorService { public string test() { return "test new"; } }此时,我们大多数情况下,需要用TestService来实现ITestService,但是少部分情况下,需要用TestService_New实现ITestService。
IOC中只实现需要用到的类:
Component.For<ITestService>() .ImplementedBy<TestService>()如果在某些地方部署时,修改为 Component.For() .ImplementedBy()
这样每次部署的时候都需要修改代码,而且需要手写的规则会越来越多。
参考了Castle的WIKI,发现了可以ServiceOverrides重写实现:
Component.For<ITestService>() .ImplementedBy<TestService>() .Named("myservice.default"), Component.For<ITestService>() .ImplementedBy<TestService_New>() .Named("myservice.new"), Component.For<TestController>() .ServiceOverrides(ServiceOverride.ForKey("myService").Eq("myservice.new"))尝试了一下,VS提示改方法已过世,建议使用Dependency.OnComponent代替。 Component.For(). .DependsOn(Dependency.OnComponent<ITestService, TestService_New>())
修改代码之后,怎么都不起作用。重新翻看官方WIKI,发现了IsDefault方法,当多个类实现同一个接口时,可以通过IsDefault来置为默认实现。
OK,大功告成。
转载于:https://www.cnblogs.com/lazio10000/p/5266876.html
