2013-11-02 10 views
1

Мы используем Ninject для инъекций зависимостей. Мы разрабатываем наш код, используя наш DDD с произвольной формой, в котором объект домена является IThing.Автономное разрешение Ninject общим типом

В следующем коде, как получить IThingControl с использованием экземпляра IThing?

interface IThing {} 
class Thing : IThing {} 

interface IThingControl<T> where T:IThing {} 
class ThingControl<Thing> {} 

class Module : NinjectModule { 
    public override void Load() { 
     Bind<IThingControl<Thing>>().To<ThingControl>(); 
    } 
} 

class SomewhereInCode { 
    void AddControls() { 
     List<IThing> things = new List<IThing> { 
      new Thing() 
     }; 
     foreach (IThing thing in things) { 
      IThingControl<IThing> control = _kernel.Get(); // <----- eh? 
      this.Controls.Add(control); 
     } 
    } 
} 

ответ

2

Вы можете получить экземпляр, используя MakeGenericType (here), но вы не можете бросить его IThingControl<IThing>

interface IThing { } 
class Thing1 : IThing { } 
class Thing2 : IThing { } 
interface IThingControl<T> where T : IThing { } 
class ThingControl<Thing> { } 

class Module : NinjectModule { 
    public override void Load() 
    { 
     Bind(typeof(IThingControl<>)).To(typeof(ThingControl<>)); 
    } 
} 

[TestFixture] 
public class SomewhereInCode 
{ 
    [Test] 
    public void AddControls() 
    { 
     IKernel kernel = new StandardKernel(new Module()); 
     List<IThing> things = new List<IThing> { new Thing1(), new Thing2() }; 
     Type baseType = typeof(IThingControl<>); 

     foreach (IThing thing in things) 
     { 
      Type type = baseType.MakeGenericType(thing.GetType()); 
      dynamic control = kernel.Get(type); 
      Assert.That(
       control is IThingControl<IThing>, 
       Is.False); 
     } 
    } 
} 
0

Я хотел бы вернуться к дизайну, если вы стремитесь, чтобы получить общий контроллер от интерфейса к его объект домена.

Ninject не очень хорошо работает с общими типами доменов в качестве интерфейсов. Это связано с тем, что они рождаются: Ninject - Managing Inconvariance of generic types?

Смежные вопросы