gpt4 book ai didi

c# - 具有静态和动态依赖关系的 IoC

转载 作者:行者123 更新时间:2023-11-30 12:34:09 25 4
gpt4 key购买 nike

我正在尝试在我的应用中实现 IoC。我有这个模型:

interface IService;
interface IComponent;

class Service : IService
Service()

class Component : IComponent
Component(IService service, object runtimeValue) { }

在我的应用程序中的某个时刻,我需要获得一个 IComponent .我的应用程序使用 IoC 容器 (Unity)。我可以注册Service使用容器,但我不能对 Component 做同样的事情其依赖项的 b/c runtimeValue .根据this我必须使用工厂并将其注入(inject)到需要获得 IComponent 的任何地方:

interface IComponentFactory
IComponent CreateComponent(object runtimeValue)

class ComponentProvider : IComponentProvider
ComponentProvider(IComponentFactory factory) { }

IComponent CreateAndCacheComponent(object runtimeValue) {
_component = factory.CreateComponent(runtimeValue)
return _component
}

// other methods

我必须能够向容器注册工厂,因此它必须只有静态依赖项。同时它必须能够提供类型为IService的服务实例。需要创建一个组件。
这是工厂实现。我唯一能想到的就是使用 Func<>委托(delegate)为依赖:

class ComponentFactory : IComponentFactory
ComponentFactory(Func<IService> serviceFactoryDelegate)

IComponent CreateComponent(object runtimeValue) {
return new Component(serviceFactoryDelegate.Invoke(), runtimeValue)
}

...并将委托(delegate)作为静态工厂注册到容器中,以便它回调容器以解析服务(我在 .net 2.0 上使用 Unity 1.2):

Container
.Configure<IStaticFactoryConfiguration>()
.RegisterFactory<Func<IService>>(container => (Func<IService>)container.Resolve<IService>)

现在我可以使用容器来解析 ComponentProvider并根据运行时值获取组件:

// this happens inside CompositionRoot
provider = Container.Resovle<IComponentProvider>()
component = provider.CreateAndCacheComponent("the component")

现在我对此有一些疑问:

  1. 我不高兴工厂调用new Component(...) .这不是穷人的DI吗?

  2. 好莱坞原则在使用Func<IService>时是否仍然成立?在工厂的构造函数上?我的意思是,它最终会调用 container.Resolve<>... 有点像 SL。唯一的区别是代码在应用程序的容器注册部分而不是在工厂类中。

  3. 就 DI 和 IoC 而言,此实现还有什么(其他)问题吗?

最佳答案

  1. 它与 Poor Man's DI 相去甚远,但如果您不必每次将新的依赖项添加到组件的构造函数时都更改此工厂方法,那就太好了。
  2. 本身不是问题。把它想象成你正在注入(inject)一个匿名工厂类。它仍然可以模拟单元测试,并且可以更改绑定(bind),因此您仍然可以获得 DI 的好处。但它是一个额外的抽象层,可能没有必要。在这种情况下,您仍然可以通过将 IService 直接注入(inject)工厂而不是 Func 来避免它。
  3. 通常在使用依赖注入(inject)时,您希望注入(inject)服务而不是。您发现必须同时拥有两者的事实可能表明您需要重新考虑类的 API。例如,也许您应该将值传递给类的方法,而不是构造函数。在不了解更多细节的情况下,很难说什么是最好的方法。

关于c# - 具有静态和动态依赖关系的 IoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7759573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com