通过更复杂的场景了解Ninject [英] Understanding Ninject with a more complex scenario

查看:81
本文介绍了通过更复杂的场景了解Ninject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用ninject来做.. ninject所做的事情..

I am trying to use ninject to.. well do what ninject does..

基本上注射没有发生.

在下面的代码中,我将在测试"中创建内核,并期望IDrinkCan实现能够以某种方式进入我的CokeComsumer类.

In my code below I am creating the Kernel in my "test" and expecting an IDrinkCan implementation to somehow get into my CokeComsumer class.

我想我在这里错过了一些事情.因为当我在CokeConsumer构造函数上放置一个断点时,IDrinkCan为null.

I think i have missed something here.. since the IDrinkCan is null when I put a break point on the CokeConsumer constructor.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ninject;
using Ninject.Modules;
using NUnit.Framework;

namespace testThing
{
public class MyDependencyKernel
{
    public static IKernel DependencyKernel { get; internal set; }

    public MyDependencyKernel()
    {
        DependencyKernel = new StandardKernel(new MyNinjectModule());
    }

    public MyDependencyKernel(NinjectModule ninjectModule)
    {
        DependencyKernel = new StandardKernel(ninjectModule);
    }
}

public class MyNinjectModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDrinkCan>().To<Coke>();
    }
}

public interface IDrinkCan
{
    void OpenCan(int canSize);
    void DrinkSome(int milliletres);
    bool IsEmpty();
}

public class Coke : IDrinkCan
{
    private int _capacity;
    private bool _isEmpty;

    public void OpenCan(int canSize)
    {
        _capacity = canSize;
    }

    public void DrinkSome(int milliletres)
    {
        if (!_isEmpty) _capacity -= milliletres;
        if (_capacity < 0) _isEmpty = true;
    }

    public bool IsEmpty()
    {
        return _isEmpty;
    }
}

public class CokeConsumer
{
    //[Inject]
    public IDrinkCan Drink { get; set; }

    [Inject] //drink is not being injected
    public CokeConsumer(IDrinkCan drink)
    {
        Drink = drink;
        Drink.OpenCan(330);
    }

    public CokeConsumer()
    {
        Drink.OpenCan(330);
    }

    public void DrinkSomeCoke(int amount)
    {
        Drink.DrinkSome(amount);
    }
}

[TestFixture]
public class SomeTestClass
{
    [Test]
    public void DoSomeTest()
    {
        MyDependencyKernel kernel = new MyDependencyKernel();

        CokeConsumer steve = new CokeConsumer();
        steve.DrinkSomeCoke(100);
    }
}
}

推荐答案

这是错误的!

[Test]
public void DoSomeTest()
{
    MyDependencyKernel kernel = new MyDependencyKernel();

    CokeConsumer steve = new CokeConsumer();
    steve.DrinkSomeCoke(100);
}

我应该从内核中获取CokeConsumer !!!

I should be getting the CokeConsumer from the kernel!!!!

var steve = kernel.DependencyKernel.Get<CokeConsumer>();

这篇关于通过更复杂的场景了解Ninject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆