我想使用ASP.NET Web表单实现IoC容器。我完成了以下步骤:
安装Ninject
和Ninject.Web
ddl
public class Global : NinjectHttpApplication
创建Kernel
public override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new Module.Module());
return kernel;
}
创建Module
public 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");
}
}
据我所知,在IMetricService
构造函数中传递MetricService
时,IoC容器必须绑定此MetricService
类。我认为我的错误很普遍,但我无法理解。
答案 0 :(得分:3)
您需要使用具有Inject
属性的公共属性,以便可以看到它们。此外,不要依赖MetricService
类的具体实现。使用服务的类应该只依赖于抽象的实现(接口,在本例中为IMetricService
)。
public partial class _Default : Page
{
[Inject]
public IMetricService metricService { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
metricService.GetAllMetrics();
}
}
公制服务并不需要自己的实例。这只是灾难的一个秘诀。更改您的MetricService类,以便它现在可以检索所有条件,而无需通过递归调用自身。
public class MetricService : IMetricService
{
public void GetAllCriteria()
{
//this is where you call out to your database
//or do whatever else you need to do to return the criteria
}
}
另外,我认为GetAllCriteria
应该返回一些东西?这通常是以前缀&#34; get&#34;开头的方法。意思。因此,您需要将返回类型从void
更改为您返回的类型。
答案 1 :(得分:0)
我可以这样做吗?
install.packages("Momocs")
我在哪里
[Inject]
private IMetrics metrics;
protected void Page_Init(object sender, EventArgs e)
{
metrics = new Metrics(metrics);
}
这是我的指标类
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IMetrics>().To<Metrics>();
}
当我把指标放在Page_Init Ninject Container中时,把真正的Metric类或者我需要用户属性来做那个。我的想法是在 Page 和 Metric 将此IMetri *接口设为有效状态。
当我这样做的时候会抛出异常
public class Metrics : IMetrics
{
private IMetrics metrics;
public Metrics(IMetrics metrics)
{
this.metrics = metrics;
}
}
[Inject]
public IMetrics metrics { get; set; }
protected void Page_Init(object sender, EventArgs e)
{
metrics = new Metrics(metrics);
}