NInject to Self实例

时间:2014-02-25 11:33:05

标签: c# winforms

有没有比这更好的方法来创建自我实例(而不是单例)的依赖注入?

public partial class MainForm : Form, IMessageLogger
{
    public MainForm(IKernel kernel) : this()
    {
        this.kernel = kernel;
        MainForm form = this;
        kernel.Bind<IMessageLogger>().ToMethod((a) => { return form; });
        (...)

仅供上下文:自我实例是一个Windows窗体,我需要监听由某个控制器创建的某些记录器事件,以便在一个文本框或状态栏中正确显示它们。

绑定到.Self()有一个Transient范围,并会为每个.Get()创建一个新对象,使用.ToProvider()只是一个杀死一只蚂蚁的正典,所以留给我{{{ 1}}但我觉得创建.ToMethod()临时值以便返回是很尴尬的。

2 个答案:

答案 0 :(得分:1)

除非这是一个非常简单的项目,否则我认为您的表单不应该实现IMessageLogger。从逻辑上讲,日志和窗口是两个完全不同的东西。这是我建议的一个选项:

  1. 创建一个实现IMessageLogger
  2. 的新类
  3. 向记录新邮件时引发的IMessageLogger添加事件。
  4. 使用IoC容器注册IMessageLogger的新具体实现。
  5. 在您的表单中,请求从容器中执行IMessageLogger,并订阅该活动。
  6. 当表单看到事件时,将消息放入ListBox或其他任何内容。
  7. 在某个地方取消订阅活动可能是个好主意,比如表单关闭时。
  8. 如果您使用IoC容器创建表单,则可能只需向IMessageLogger类型的构造函数添加新参数即可。

    现在,任何都可以显示您的日志消息。现在,日志记录工具与您的表单分离,使维护更容易,等等。也可以在主窗口打开之前记录消息,这可能很有用。

答案 1 :(得分:0)

答案历史上最短的答案:)

kernel.Bind<IMessageLogger>().ToMethod((a) => { return this; });