2015-03-04 3 views
0

У меня есть приложение службы wcf, и я только что реализовал библиотеку ninject. На веб-сайте ninject приведен пример:Ninject Binding Issue

public class Samurai { 
    public IWeapon Weapon { get; private set; } 
    public Samurai(IWeapon weapon) 
    { 
     this.Weapon = weapon; 
    } 
} 

public class WarriorModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IWeapon>().To<Sword>(); 
    } 
} 

У меня есть классы, подобные этому. Но проблема в том, как создать экземпляр класса Samurai? У конструктора есть параметр (IWeapon), но параметр привязан Sword или к другому классу. Когда я хочу создать экземпляр класса Samurai, компилятор ожидает IWeapon параметра типа. В моем классе модуля (например, WarriorModule) я уже определил его привязку. Как передать параметр (или по-другому) на Samurai класс constuctor?

ответ

0

Я просто понял, как сделать это. Нет необходимости создавать интерфейс ISamurai. В Warriormodule:

public class WarriorModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IWeapon>().To<Sword>(); 
     Bind<Samurai>().ToSelf(); 
    } 
} 

Чтобы создать экземпляр Samurai:

var samurai = kernel.Get<Samurai>(); 
+0

Слово предупреждения; убедитесь, что вы уверены, что вы довольны «самураем» как неизменным типом класса. У меня нет никаких возражений против самонастраиваемых типов, просто убедитесь, что вы всегда будете довольны тем, что один класс вводится, а не тот, который можно поменять, когда это необходимо. –

2

Попробуйте

class Program 
{ 
    static void Main(string[] args) 
    { 
     IKernel kernel = new StandardKernel(new WarriorModule()); 
     var samurai = kernel.Get<ISamurai>(); 
    } 
} 

public interface ISamurai 
{ 
} 

public class Samurai : ISamurai 
{ 
    public IWeapon Weapon { get; private set; } 
    public Samurai(IWeapon weapon) 
    { 
     this.Weapon = weapon; 
    } 
} 

public interface IWeapon 
{ 

} 

public class Sword : IWeapon 
{ 

} 

public class WarriorModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<ISamurai>().To<Samurai>(); 
     this.Bind<IWeapon>().To<Sword>(); 
    } 
} 
+0

Мой проект имеет несколько слоев и в соответствии с этим примером IWeapon и самурайские классы существует на разных слоях. Чтобы добавить интерфейсы для всех классов, которые находятся внутри этого слоя (слой класса Samurai), требуется дополнительная рабочая нагрузка. Могу ли я достичь этого по-другому? –