gpt4 book ai didi

c# - 使用Unity进行属性依赖注入(inject)的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:49 55 4
gpt4 key购买 nike

我有一个类需要依赖注入(inject)。由于该类已经是另一个抽象的实现,并且它的“同级”实现可能不共享相同的依赖项,所以我尝试使用属性注入(inject)而不是构造函数注入(inject)。

(所有这些类/接口(interface)名称仅用于说明目的)

我的 IProvider 抽象:

public interface IProvider
{
void ProviderMethod();
}

我的 IProvider 实现(带有我要注入(inject)的 IData 依赖项):

public class ProviderClass : IProvider
{
// How do I inject this dependency?
[Dependency]
public IData data { get; set; }

public void ProviderMethod()
{
// Can't do this as data == null!
data.DataMethod();
}
}

另一个 IProvider 实现(示例表明它没有相同的依赖项):

public class AnotherProviderClass : IProvider
{
// No data dependency here!!

public void ProviderMethod()
{
// Do other stuff here
}
}

IData 抽象和实现示例:

public interface IData
{
void DataMethod();
}

public class DataClass : IData
{
public void DataMethod();
}

我需要知道的是:如何使用 Unity(我选择的 IOC 容器)将属性依赖项 (IData) 成功注入(inject)到 ProviderClass 中?

我已经尝试了所有方式的 Unity 注册选项(RegisterType、RegisterInstance、Resolve...),但我注入(inject)的属性总是以 NULL 结束。我想正确地做这件事,而不是强制随机代码直到它成功运行。

或者是否有更好的方法将(可选的)依赖项注入(inject)“兄弟”类?

顺便说一下,我最初的 IProvider 实现是通过抽象工厂创建的,所以也许这可能是我应该关注 IData 依赖的另一个领域(?)

最佳答案

你仍然应该使用构造函数注入(inject),因为 dependencies should hardly ever be optional .

您正试图阻止 constructor over-injectionIProviderFactory 实现中,您可能不想将容器注入(inject)您的工厂以防止落入 Service Locator anti-pattern .

但是,如果您在 Composition Root 中定义了 IProviderFactory 实现,你阻止自己做服务定位器,即使你注入(inject)了容器,因为Service Locator is not about mechanics .

所以你应该定义你的 ProviderFactory 实现尽可能接近你的 Unity 配置,它应该看起来像这样:

public class ProviderFactory : IProviderFactory
{
private readonly Dictionary<string, Type> providerTypes;
private readonly Container container;

public ProviderFactory(Dictionary<string, Type> providerTypes,
Container container) {
this.providerTypes = providerTypes;
this.container = container;
}

public IProvider CreateProvider(string name) {
return (IProvider)this.container.Resolve(this.providerTypes[name]);
}
}

这个实现可以在Unity中注册为单例。这使您不必将构造函数过度注入(inject)工厂,同时远离服务定位器。

关于c# - 使用Unity进行属性依赖注入(inject)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22860607/

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