2015-11-02 124 views
0

我正在尝试使用Ninject来执行多依赖注入。我有3个班级,EmailHelper,ExceptionHelperReportHelperExceptionHelper类别要求EmailHelperReportHelper要求ExceptionHelper。这是我的代码。使用Ninject的多依赖注入

IKernel _kernel = new StandardKernel(); 
_kernel.Load(Assembly.GetExecutingAssembly()); 

IEmailHelper _emailHelper = _kernel.Get<IEmailHelper>(); 

ExceptionHelper exceptionHelper = new ExceptionHelper(_emailHelper); 
ReportHelper reportHelper  = new ReportHelper(exceptionHelper); 

ExceptionHelperIEmailHelper似乎松耦合,但ReportHelperExceptionHelper仍然紧密耦合。

我该如何让ReportHelperExceptionHelper松耦合?

我可以修改我的代码吗?

IExceptionHelper _exceptionHelper = _kernel.Get<IExceptionHelper>(); 
ReportHelper reportHelper = new ReportHelper(_exceptionHelper); 

IExceptionHelper不与IEmailHelper启动? 我很困惑。

[编辑]

这是我ExceptionHelper构造。 Rest构造函数具有相同的结构。

private IEmailHelper _emailHelper; 
public ExceptionHelper(IEmailHelper eh) 
{ 
    _emailHelper = eh; 
} 
+1

为每个创建相应的接口。 –

+0

@DavidL我已经为每个类制作了接口。 – jkl

+0

你可以在你的问题中包含这些类的构造函数吗? –

回答

2

你的类的构造函数应该像这样的事情:

public ExceptionHelper(IEmailHelper email_helper) 
{ 
    m_EmailHelper = email_helper; 
} 

public ReportHelper(IExceptionHelper exception_helper) 
{ 
    m_ExceptionHelper = exception_helper; 
} 

然后,你需要确保你所有的类型都与这样的容器中注册(或使用其他自动方式注册):

kernel.Bind<IReportHelper>().To<ReportHelper>(); 
kernel.Bind<IExceptionHelper>().To<ExceptionHelper>(); 
kernel.Bind<IEmailHelper>().To<EmailHelper>(); 

然后你就可以建立一个IReportHelper情况是这样的:

IReportHelper report_helper = kernel.Get<IReportHelper>(); 

容器会自动管理接线。

+0

我不明白'IReportHelper report_helper = kernel.Get ()'这个部分。我不需要传递'IExceptionHelper'实例作为参数? – jkl

+1

是的。 DI容器会检测到ReportHelper的构造函数需要一个IExceptionHelper依赖关系,并且它能够注入它。这被称为自动布线。 –

+0

非常感谢! – jkl