【问题标题】:Simple Injector - inject container propertySimple Injector - 注入容器属性
【发布时间】:2014-04-20 20:44:15
【问题描述】:

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

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

我想要这个功能,因为我不通过构造函数传输容器对象 - 因为如果我可以使用注册对象的自动注入。

我的使用思路:

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

ISomething:

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;}
}

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

非常感谢。

【问题讨论】:

  • 你能贴一些代码吗?
  • 添加示例代码...

标签: c# containers ioc-container simple-injector


【解决方案1】:

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

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

所以你可以将你的类重写为以下内容:

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 注入另一个类仍然很有用。例如,当创建位于内部合成根的工厂类时。在这种情况下,您仍然可以使用构造函数注入,如下所示:

// 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 构造函数参数,它会自动将自己注入到构造函数中。

【讨论】:

  • 非常感谢。对我来说是正确答案!我猜第一个带有环境参数的 SomeMethod 是错误的,它是构造函数,不是吗?
  • @Frk:那应该是构造函数。修好了。
  • 您好 @Steven 先生,我可以使用工厂内的容器来创建先前注册服务的实例吗? ??
  • "如果 Simple Injector 检测到 Container 构造函数参数,它会将自己注入到构造函数中。您无需对此进行任何操作。" => 最后一行很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多