C#学习教程:如何写一个库而不强迫用户使用库的IOC容器鉴于应用程序保证使用IOC容器来连接其依赖项,如果这两个容器不同,那么它们如何才能很好地协同工作?场景是应用程序具有依赖于库中类型的类。因此,当应用程序容器尝试构建此类时,它需要知道如何解析库中的类型。这是一个冗长的问题:这个问题似乎之前在SO上以各种形式和形式被问过,但我似乎找不到我需要的答案,所以我将使用一个假设的_over_simplified_具体示例。我们想编写一个用于日志记录的库,用户可以将其作为一个包包含在他们的解决方案中,以获得开箱即用的日志记录功能。库暴露的公共接口是..publicinterfaceILogger{}publicinterfaceITarget{}具体实现是internalclassLogger:ILogger{publicLogger(ITargettarget){}}internalclassFileTarget:ITarget{}要求是如果用户包含我们的包并定义一个具有ILogger类型的属性或ILogger类型的ctor参数的类,那么我们的库负责将该接口的具体实现注入到用户定义的类中。默认情况下,注入的logger会去文件系统进行日志记录,因为注入到ILogger实现中的FileTarget默认实现是我们库的FileTarget。如果用户决定编写一个实现ITarget接口的类,那么我们的库将使用它来注入Logger类,而不是使用其默认的FileTarget实现。所以我要证明的是,他们在这里是双向依赖。我们的库依赖于用户的程序集,因为它需要扫描用户的程序集以加载任何扩展点(即ITarget实现)并在任何默认实现之前将它们注入到自己的对象中。用户的程序集依赖于库,因为如果用户选择定义一个具有ILogger接口的类作为依赖项,则该用户对象应该在运行时获得对我们库提供的该接口的具体引用。简单的解决办法就是如果用户和我们的库都使用同一个IOC容器,那么问题就解决了。但这是一个强有力的假设。我想要做的是使用IOC容器和最符合库要求的库,在我的例子中是Ninject。在运行时,以某种方式为用户提供一种机制,让用户通过某些API调用我的库,以确保激活Ninject并扫描用户的程序集并链接所有考虑所有扩展点的内容。到目前为止一切顺利,完全可以实现,但这是棘手的部分。我几乎想在库中定义某种子容器,其接口类似于此函数publicinterfaceIDependencyResolvingModule{TGet();[]TGetAll();并提供一个实现,该实现使用我们选择的库容器(即Ninect)来解析上面定义的两种方法中请求的类型。我希望用户的IOC容器具有一些功能,如果它不能解析依赖项(即ILogger),它应该挂接到IDependencyResolvingModule实现并请求依赖项。这样我们的库就可以使用它选择的IOC容器,并且用户的代码有办法解决IOC容器没有任何线索的依赖项。如果IOC容器有一些功能来注册执行程序集目录中的程序IDependencyResolverModules找到的IDependencyResolverModules的任何单例实例,并在无法解析类型时询问任何单例模块,那么这个解决方案是否可行?但是除非所有其他IOC容器都需要容纳,否则如何解决这个问题?因此,几行中的问题是,当第3方程序集选择使用IOC容器作为其内部时,什么是简单的解决方案,以便库可以简单地为外部的IOC容器提供一种机制来挂钩和解决库中存在的依赖关系.我在这里看到了几种可能的方法:为所有流行的IoC容器编写默认注册器。它们中的每一个都应该放在一个单独的组件中。然后开发人员可以选择他需要的一个并用它配置他的容器。定义您自己的工厂抽象并编写将返回默认记录器的默认实现。让开发者替换那个工厂的实现。例如,使用适配器作为他最喜欢的容器。这种方法与容器无关,因为开发人员只能使用默认的工厂实现。但是这种方式与自动布线无关。第一种方法的惰性变体。编写一个关于配置容器以使用默认实现的小剧本。然后开发人员可以自己配置容器。结合之前所有的解决方案,满足每一个开发者?EDIT:增加了两个容器集成的例子以上是C#学习教程:如何编写库共享的全部内容而不强制用户使用库的IOC容器,如果对大家有用需要进一步了解C#学习教程,希望大家多多关注——varallPublicInterfacesFromLibrary=typeof(AnyLibraryType).Assembly.GetTypes().Where(t=>t.IsInterface&&t.IsPublic);foreach(varlibraryInterfaceinallPublicInterfacesFromLibrary){varlocal=libraryInterface;//防止关闭}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
