首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单注入器-注入容器属性

简单注入器-注入容器属性
EN

Stack Overflow用户
提问于 2014-03-15 12:45:06
回答 1查看 2.4K关注 0票数 4

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

然后我想注册自己的容器,但容器没有接口。

我想要这个功能,因为我不通过构造函数传输Container -因为如果我可以使用寄存器对象的自动注入,为什么?

我的使用理念:

代码语言:javascript
复制
var container = new Container();
container.Options.AutowirePropertiesWithAttribute<InjectableProperty>();
container.Register<ISomething, Something>(Lifestyle.Singleton);

ISomething:

代码语言:javascript
复制
public interface ISomething 
{
   void SomeMethod();
}

某某类:

代码语言:javascript
复制
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;}
}

你有办法做到这一点吗?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-15 14:49:58

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

与其让每个类回调到容器(称为服务定位器反模式),不如使用依赖注入。通过依赖注入,您可以注入依赖项,而不是请求它们。

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

代码语言:javascript
复制
public class Something : ISomething 
{
    private readonly IEnvironment environment;

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

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

此外,除了存储传入的依赖项之外,还要防止在构造函数中执行任何逻辑操作。这允许您用置信度合成目标图

然而,在某些情况下,将Container注入另一个类仍然是有用的。例如,在创建位于复合根中的工厂类时。在这种情况下,仍然可以使用构造函数注入,如下所示:

代码语言:javascript
复制
// 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构造函数参数,它将自动将自己注入构造函数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22423970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档