C# 引用项目的依赖注入

C# 引用项目的依赖注入,c#,webforms,ninject,C#,Webforms,Ninject,我一直在尝试用Ninject实现一些东西(对库没有太多的了解),并且意识到可能无法实现我想要的 我有一个我们自己的项目,我曾经引用过,并试图使用Ninject来推送一些依赖项,比如: public class ImageHelper { [Inject] public static AdaptiveImageSettings Settings { get; set; } [Inject] public static IImageS

我一直在尝试用Ninject实现一些东西(对库没有太多的了解),并且意识到可能无法实现我想要的

我有一个我们自己的项目,我曾经引用过,并试图使用Ninject来推送一些依赖项,比如:

public class ImageHelper
{
        [Inject]
        public static AdaptiveImageSettings Settings { get; set; }

        [Inject]
        public static IImageSizerFactory Factory { get; set; }
    }
}
其目的是提供一些设置(可以由不同的类提供服务)和一个可以创建ImageHelper类实例的工厂。我不太关注什么是静态的,什么不是现在

如果我尝试从引用该项目的Web应用程序中使用ImageHelper,那么这些属性总是空的。从我的Web应用程序中具有以下内容的页面,可以很好地注入依赖项:

 public partial class _Default : Page
 {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        [Inject]
        public NetC.Core.ImageSizer.IImageSizerFactory Factory { get; set; }
 }

据我所知,这是因为内核确实是自动处理的,但我似乎无法找到一种方法来访问内核,以便解析这些属性。有人能给我一些建议,如果这是合理可行的,或者下一步可能是什么?到目前为止,我只看到了ServiceLocator反模式,似乎找不到符合要求的扩展

对于任何容器来说都是一个糟糕的用例


只需在应用程序启动时手动分配它们

您应该转到构造函数注入:

公共类ImageHelper
{
私有只读自适应图像设置;
私人只读IImageSizerFactory工厂;
公共图像助手(自适应图像设置,IImageSizerFactory工厂){
this.settings=设置;
这个工厂=工厂;
}
}
当您从Ninject请求
ImageHelper
时,Ninject将自动将适当的依赖项注入其构造函数。构造函数有许多优点,例如:

  • 它明确说明了类型需要什么,并成为合同
  • 定义类型不必知道依赖项的生活方式(而ImageHelper强制其依赖项为单例)
  • 不能忘记依赖项(构造函数需要它们)

因此,只要有可能,就尽可能多地进行构造函数注入。

如何解决页面中的
工厂问题?因为这看起来很奇怪——您似乎声称Ninject成功地解决了工厂,但没有解决它的内部依赖关系。当然,这些属性是静态的,这可能是Ninject不想接触它们的原因。您是否尝试在那里拥有实例属性?@WiktorZychla:工厂是通过使用InjectAttribute解决的(我在NinjectWebCommon的其他地方显然有一个KernelBinds)。但是我猜Ninject在页面上做了一些事情,但是ImageHelper上的“知道”或“拦截”请求吗?我已经尝试基于这一点创建属性实例,但没有任何区别。Ninject知道这一点,因为它通过对
kernel.Inject(page)
的简单调用来扩展
OnPageInitComplete
。但是,解析属性依赖项仍然应该递归地工作,因此,我不知道为什么不解析图像助手上的实例属性。我的想法是试着去那里。你能试着报告一下吗?递归可能是问题所在-ImageHelper此时不在页面上。当然Ninject需要了解实例吗?例如MVC控制器,它不是以某种方式拦截它们的构造以解决依赖关系解析吗?@Ian:Ninject有时可以解析未注册的类型(例如
ImageHelper
,因为它是具体的),但通常最好显式注册所有内容。因此,您应该注册(绑定)
ImageHelper
AdaptiveImageSettings
IImageSizerFactory
。您能进一步解释一下绑定吗?我目前已经获得了与
kernel.Bind(new ImageSizerFactory())
相关的绑定定义,您是指以某种方式注册ImageHelper的属性吗?