依赖注入引用项目

时间:2014-06-02 08:08:53

标签: c# webforms ninject

我一直试图通过Ninject实现某些目标(对图书馆没有很好的理解)并且意识到可能无法做我想做的事。

我已经获得了我自己引用的项目之一,并尝试使用Ninject推送一些依赖项,例如:

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

        [Inject]
        public static IImageSizerFactory Factory { get; set; }
    }
}

目标是设置一些设置(可以由不同的类提供)和一个可以创建ImageHelper类实例的Factory。我不太关注什么是静态的,现在还没有。

如果我尝试使用引用该项目的WebApplication中的ImageHelper,但这些属性始终为null。从我的WebApplication中的一个页面中,以下内容可以很好地注入依赖项:

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

        }

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

据我所知,这是因为内核会自动处理,但我似乎无法找到获取内核的方法,因此我可以解析这些属性。有人可以给我一些指示,如果这是合理可能的,或者下一步可能是什么?到目前为止,我只看到了ServiceLocator反模式,似乎无法找到符合要求的扩展程序。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你应该转向构造函数注入:

public class ImageHelper
{
    private readonly AdaptiveImageSettings settings;
    private readonly IImageSizerFactory factory;

    public ImageHelper(AdaptiveImageSettings settings, IImageSizerFactory factory) {
        this.settings = settings;
        this.factory = factory;
    }
}

当您从Ninject请求ImageHelper时,ninject会自动将正确的依赖项注入其构造函数中。构造函数有许多优点,例如:

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

所以,只要你可以,尽可能多地进行构造函数注入。