1

我真的进入了 DI/IoC 的事情——它让一些事情变得容易多了。但是,我有一些继承的类实现了一个具有所需的无参数构造函数的类,因此我使用服务定位器来获得我想要的:

MyMembershipProivder() : MyMembershipProvider(ServiceLocator.Current.GetInstance<...>){}
MyMembershipProivder(IMemberRepo memberRepo){...}

完美运行。但是,由于我也在使用 MVC3 DependencyResolver,我发现自己别无他法,只能这样做:

var locator = new NinjectServiceLocator(kernel);
DependencyResolver.SetResolver(locator);
ServiceLocator.SetLocatorProvider(() => locator);

DependencyResolver 在 MVC 应用程序中使用,ServiceLocator 在各种类库中使用。

这是执行此操作的理想方法吗?我错过了什么吗?

更新

在上面的示例中,该类是一个自定义的 asp.net 成员资格提供程序。asp.net 成员提供程序工厂要求我的自定义提供程序具有无参数构造函数,这迫使我使用服务定位器来注入它在内部使用的存储库。

4

2 回答 2

2

您不需要无参数构造函数,依赖解析器会将您的依赖项注入构造函数:

MyMembershipProivder(IMemberRepo memberRepo){...}

您可以替换默认控制器工厂(在控制器中使用无参数构造函数):

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

您不需要更换默认控制器工厂,请参阅下面的 Linkgoron 评论。

无论如何,我认为为 MVC 应用程序使用 Dependency Resolver 和为你的类库使用 Service Locator 很好。

希望这可以帮助。

于 2011-02-26T20:04:06.197 回答
0

似乎您真的别无选择,除非您可以重构您的应用程序以从一开始就使用 DI。所以,我想使用自定义服务定位器是你最好的选择。

虽然,如果您“继承”的类是控制器类,您可以删除默认构造函数并完成它,因为 MVC 将为您处理一切。

我从未见过 ServiceLocator 类,是这个吗?

编辑:

正如我所说,我没有看到你有任何其他的脱钩选择。服务位置可能是您最好的选择,不会引入过多的臃肿和复杂性。

作为.Net FW 中内置的东西实现的东西,您应该寻找特定的解决方案,例如为会员提供者提供的解决方案。

于 2011-02-26T21:00:00.020 回答