使用 Ninject 的多重依赖注入
Multiple Dependency Injection using Ninject
我正在尝试使用 Ninject 进行多重依赖注入。
我有 3 个 classes,EmailHelper
,ExceptionHelper
和 ReportHelper
。
ExceptionHelper
class 需要 EmailHelper
而 ReportHelper
需要 ExceptionHelper
。这是我的代码。
IKernel _kernel = new StandardKernel();
_kernel.Load(Assembly.GetExecutingAssembly());
IEmailHelper _emailHelper = _kernel.Get<IEmailHelper>();
ExceptionHelper exceptionHelper = new ExceptionHelper(_emailHelper);
ReportHelper reportHelper = new ReportHelper(exceptionHelper);
ExceptionHelper
和 IEmailHelper
似乎松耦合,但 ReportHelper
和 ExceptionHelper
仍然紧密耦合。
如何使 ReportHelper
和 ExceptionHelper
松耦合?
我可以这样修改我的代码吗?
IExceptionHelper _exceptionHelper = _kernel.Get<IExceptionHelper>();
ReportHelper reportHelper = new ReportHelper(_exceptionHelper);
但是IExceptionHelper
不是用IEmailHelper
发起的吗?
我很困惑。
[已编辑]
这是我的 ExceptionHelper
构造函数。其余构造函数具有相同的结构。
private IEmailHelper _emailHelper;
public ExceptionHelper(IEmailHelper eh)
{
_emailHelper = eh;
}
您的 类 的构造函数应该如下所示:
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>();
并且容器会自动管理布线。
我正在尝试使用 Ninject 进行多重依赖注入。
我有 3 个 classes,EmailHelper
,ExceptionHelper
和 ReportHelper
。
ExceptionHelper
class 需要 EmailHelper
而 ReportHelper
需要 ExceptionHelper
。这是我的代码。
IKernel _kernel = new StandardKernel();
_kernel.Load(Assembly.GetExecutingAssembly());
IEmailHelper _emailHelper = _kernel.Get<IEmailHelper>();
ExceptionHelper exceptionHelper = new ExceptionHelper(_emailHelper);
ReportHelper reportHelper = new ReportHelper(exceptionHelper);
ExceptionHelper
和 IEmailHelper
似乎松耦合,但 ReportHelper
和 ExceptionHelper
仍然紧密耦合。
如何使 ReportHelper
和 ExceptionHelper
松耦合?
我可以这样修改我的代码吗?
IExceptionHelper _exceptionHelper = _kernel.Get<IExceptionHelper>();
ReportHelper reportHelper = new ReportHelper(_exceptionHelper);
但是IExceptionHelper
不是用IEmailHelper
发起的吗?
我很困惑。
[已编辑]
这是我的 ExceptionHelper
构造函数。其余构造函数具有相同的结构。
private IEmailHelper _emailHelper;
public ExceptionHelper(IEmailHelper eh)
{
_emailHelper = eh;
}
您的 类 的构造函数应该如下所示:
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>();
并且容器会自动管理布线。