【发布时间】:2016-07-09 08:41:24
【问题描述】:
我想使用 ASP.NET Web 表单实现 IoC 容器。我已完成以下步骤:
安装
Ninject和Ninject.Webddlpublic class Global : NinjectHttpApplication-
创建
Kernelpublic override IKernel CreateKernel() { IKernel kernel = new StandardKernel(new Module.Module()); return kernel; } -
创建
Modulepublic override void Load() { Bind<IMetricService>().To<MetricService>(); } -
在
Page上使用注入public partial class _Default : Page { [Inject] private IMetricService metricService; protected void Page_Init(object sender,EventArgs e) { metricService = new MetricService(metricService); } protected void Page_Load(object sender, EventArgs e) { metricService.GetAllMetrics(); } }
这是我的MetricService 课程
public class MetricService : IMetricService
{
[Inject]
private IMetricService _metricService;
public MetricService(IMetricService metricService)
{
this._metricService = metricService;
}
public void GetAllCriteria()
{
_metricService.GetAllCriteria();
Console.WriteLine("metric service");
}
}
据我了解,当在MetricService 构造函数中传递IMetricService 时,IoC 容器必须绑定此MetricService 类。我认为我的错误是一般性的,但我不明白在哪里。
【问题讨论】:
-
DI 的想法是让你没有依赖项,在你的 PageInit 中你正在新建一个依赖项?
-
在 PageInit 我需要做什么?
-
先去掉metricService = new MetricService(metricService);容器将为您提供正确的实例。
-
我不明白你的意思
-
这让我相信您并不完全了解 DI 容器的用途。 DI 容器将抽象映射到具体化,因此在您的类中,您不必依赖具体化,从而减少耦合。当您执行“新”操作时,您正在创建一个实例,因此完全否定了容器为您所做的工作。看看这个也许并阅读更多关于 DI 的内容。 stackoverflow.com/questions/4933695/…
标签: c# asp.net webforms inversion-of-control ioc-container