有没有比这更好的方法来创建自我实例(而不是单例)的依赖注入?
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()
临时值以便返回是很尴尬的。
答案 0 :(得分:1)
除非这是一个非常简单的项目,否则我认为您的表单不应该实现IMessageLogger
。从逻辑上讲,日志和窗口是两个完全不同的东西。这是我建议的一个选项:
IMessageLogger
。IMessageLogger
添加事件。IMessageLogger
的新具体实现。IMessageLogger
,并订阅该活动。如果您使用IoC容器创建表单,则可能只需向IMessageLogger
类型的构造函数添加新参数即可。
现在,任何都可以显示您的日志消息。现在,日志记录工具与您的表单分离,使维护更容易,等等。也可以在主窗口打开之前记录消息,这可能很有用。
答案 1 :(得分:0)
答案历史上最短的答案:)
kernel.Bind<IMessageLogger>().ToMethod((a) => { return this; });