【问题标题】:Using a ServiceLocator in Class LIbraries and MVC DependencyResolver在类库和 MVC DependencyResolver 中使用 ServiceLocator
【发布时间】:2011-07-04 10:57:00
【问题描述】:

我已经真正涉足了 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 成员提供程序工厂要求我的自定义提供程序具有无参数构造函数,这迫使我使用服务定位器来注入它在内部使用的存储库。

【问题讨论】:

    标签: asp.net-mvc dependency-injection asp.net-mvc-3 ioc-container service-locator


    【解决方案1】:

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

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

    没见过ServiceLocator类,是不是this?

    编辑:

    正如我所说,我认为您没有任何其他的解耦选项。服务位置可能是您最好的选择,而且不会引入过多的臃肿和复杂性。

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

    【讨论】:

    • 是的,我使用的是同一款。我已经更新了这个问题。如您所见,我需要 ServiceLocator 来查找要使用重载构造函数注入的服务。
    【解决方案2】:

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

    MyMembershipProivder(IMemberRepo memberRepo){...}
    

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

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

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

    我认为,无论如何使用 MVC 应用程序的依赖解析器和类库的服务定位器都很好。

    希望这会有所帮助。

    【讨论】:

    • 依赖注入不需要替换 MVC 3 中的默认控制器工厂。
    • 嗯,我不知道,但实际上是有道理的,感谢您的评论。 ;)
    • 我更新了问题,不是针对控制器的。在这种情况下,需要无参数构造函数。
    • 关于 MembershipProvider 和 DI,见stackoverflow.com/questions/1003587/…
    • 谢谢,这是一个有趣的解决方案。但归根结底,他们仍在使用 ServiceLocator 并创建了另一个类(ProviderFactory)。我认为没有办法绕过 ServiceLocator - 只是希望使用一个而不是两个。
    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多