gpt4 book ai didi

c# - 简单注入(inject)器 - 注入(inject)容器属性

转载 作者:行者123 更新时间:2023-11-30 20:50:36 24 4
gpt4 key购买 nike

我想通过 SimpleInjector 注入(inject) Container 属性。我没有找到 SimpleInjector 的任何功能。

然后想给自己注册self容器,但是Container没有接口(interface)。

我想要此功能,因为我不通过构造函数传输 Container 对象 - 因为如果我可以使用寄存器对象的自动注入(inject)。

我的使用思路:

var container = new Container();
container.Options.AutowirePropertiesWithAttribute<InjectableProperty>();
container.Register<ISomething, Something>(Lifestyle.Singleton);

我是什么东西:

public interface ISomething 
{
void SomeMethod();
}

类:

public class Something : ISomething 
{
public void SomeMethod()
{
var environment = _container.GetInstance<IEnvironment>();
environment.DoSomething();
}

[InjectableProperty] // - maybe it is not possible (I don't know it)
Container Container {get;set;}
}

你有什么想法可以实现吗?

非常感谢。

最佳答案

防止您的应用程序代码依赖于容器。在你的应用程序中唯一应该知道你的 DI 库存在的地方是 Composition Root (您注册所有依赖项的地方)。

与其让每个类回调到容器(称为 Service Locator anti-pattern ),不如使用依赖注入(inject)。使用依赖注入(inject),您可以注入(inject)依赖项而不是请求它们。

因此您可以将类重写为以下内容:

public class Something : ISomething 
{
private readonly IEnvironment environment;

public Something (IEnvironment environment)
{
this.environment = environment;
}

public void SomeMethod()
{
this.environment.DoSomething();
}
}

此外,除了存储传入的依赖项之外,请避免在构造函数中执行任何逻辑。这允许您 compose object graphs with confidence .

然而,在某些情况下,将 Container 注入(inject)到另一个类中仍然很有用。例如,在创建位于 inside Composition Root 的工厂类时。在那种情况下,您仍然可以使用构造函数注入(inject),如下所示:

// Defined in an application layer
public interface IMyFactory
{
IMyService CreateService();
}

// Defined inside the Composition Root
public class MyFactory : IMyFactory
{
private readonly Container container;

public MyFactory(Containter container)
{
this.container = container;
}

public IMyService CreateService(ServiceType type)
{
return type == ServiceType.A
? this.container.GetInstance<MyServiceA>()
: this.container.GetInstance<MyServiceB>();
}
}

如果 Simple Injector 检测到 Container 构造函数参数,它会自动将自身注入(inject)到构造函数中。

关于c# - 简单注入(inject)器 - 注入(inject)容器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423970/

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