IoC Container不适用于WebForms

时间:2016-03-22 12:44:41

标签: c# asp.net webforms inversion-of-control ioc-container

我想使用ASP.NET Web表单实现IoC容器。我完成了以下步骤:

  1. 安装NinjectNinject.Web ddl

  2. public class Global : NinjectHttpApplication

  3. 创建Kernel

    public override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new Module.Module());
        return kernel;
    }
    
  4. 创建Module

    public override void Load()
    {
        Bind<IMetricService>().To<MetricService>();
    }
    
  5. Page

    上使用Inject
    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();
        }
    }
    
  6. 这是我的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类。我认为我的错误很普遍,但我无法理解。

2 个答案:

答案 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);
        }