【发布时间】:2018-01-23 16:10:05
【问题描述】:
我的任务是建立代码模式以用于我们将要构建的新应用程序。早期决定使用 Prism 和 MEF 构建我们的应用程序和库,目的是简化跨应用程序的功能测试和重用。
随着我们代码库的增长,我遇到了一个问题。 假设我们有一些需要访问某个系统的基础库 - 比如说一个用户管理系统:
public interface IUserManagementSystem
{
IUser AuthenticateUser(string username, string password);
}
// ...
public class SomeClass
{
[ImportingConstructor]
public SomeClass(IUserManagementSystem userSystem){ }
}
我们现在可以使用 ServiceLocator 创建 SomeClass 类型的对象,但前提是已注册 IUserManagementSystem 的实现。无法知道(在编译时)创建是成功还是失败,需要哪些实现或其他关键信息。
如果我们在库中使用ServiceLocator,这个问题会变得更加复杂。
查找现在隐藏的依赖项已成为比旧应用程序中的硬编码依赖项更大的问题。 IoC 和依赖注入模式并不新鲜,一旦我们从编译器中拿走这项工作,我们应该如何管理依赖关系?我们是否应该完全避免在库代码中使用 ServiceLocator(或其他 IoC 容器)?
编辑:我特别想知道如何处理横切关注点(例如日志记录、通信和配置)。我已经看到了一些关于构建 CCC 项目的建议(大概是大量使用单例)。在其他情况下 (Is the dependency injection a cross-cutting concern?),建议在整个库中使用 DI 框架,这会导致跟踪依赖项的原始问题。
Dependency Inject (DI) "friendly" library 有点相关,因为它解释了如何以可以在有或没有 DI 框架的情况下使用的方式构造代码,但它没有说明在 一个库或如何确定给定库所需的依赖项。那里的标记答案提供了有关与 DI 框架交互的可靠架构建议,但它没有解决我的问题。
【问题讨论】:
标签: c# dependency-injection inversion-of-control prism mef