Привязка интерфейса к 2 различным конкретным объектам в ninject на основе атрибута метода - PullRequest
1 голос
/ 08 апреля 2010

У меня есть 2 разных бетонных объекта, давайте сохраним ConcreteOne и ConcreteTwo.Каждый из них реализует интерфейс ILooseyGoosey.Я хотел бы, чтобы ninject вызывал другой метод в зависимости от атрибута этого метода.

Это то, что я имею до сих пор:

public class ConcreteOne : ILooseyGoosey
{
  public void SomeMethod() { };
}
public class ConcreteTwo : ILooseyGoosey
{
  public void SomeMethod() { } ;
}
public interface ILooseyGoosey
{
  [CallConcreteTwo()]
  void SomeMethod();
}

Это то, что я определил в своем модуле Ninject.:

public override void Load()
{
  Bind<ILooseyGoosey>().To<ConcreteOne>().InjectMethodsWhere(mi => mi.GetCustomAttributes(true).Where(a => a.GetType() == typeof(CallConcreteTwoAttribute)).Count() == 0);
  Bind<ILooseyGoosey>().To<ConcreteTwo>().InjectMethodsWhere(mi => mi.GetCustomAttributes(true).Where(a => a.GetType() == typeof(CallConcreteTwoAttribute)).Count() > 0);
}

Я получаю сообщение об ошибке:

System.NotSupportedException: Ошибка регистрации службы ILooseyGoosey: для службы объявлено несколько привязок по умолчанию.Найдено 2 привязки по умолчанию:

Ответы [ 3 ]

1 голос
/ 05 марта 2011

Не уверен, если вам все еще нужен ответ, подход на основе метаданных - это путь. Вы хотите связать метаданными в Ninject 2.0. См. Контекстные привязки с Ninject 2.0

1 голос
/ 26 ноября 2012

Не написано мной. Пожалуйста, смотрите: http://www.ninject.org/wiki.html

Ninject
Download it Extensions Contribute Visit the Dojo Speak up Sponsors Merchandise

Version:  
»Ninject
»MVC3
Multi injectionEdit PagePage History
Ninject allows you to inject multiple objects bound to a particular type or interface. For example, if we have our IWeapon interface, and two implementations, Sword and Dagger:

public interface IWeapon
{
    string Hit(string target);
}

public class Sword : IWeapon 
{
    public string Hit(string target) 
    {
        return "Slice " + target + " in half";
    }
}

public class Dagger : IWeapon 
{
    public string Hit(string target) 
    {
        return "Stab " + target + " to death";
    }
}
Here we have the Samurai class. You can see that its constructor takes an array of IWeapon.

public class Samurai 
{
    readonly IEnumerable allWeapons;
    public Samurai(IWeapon[] allWeapons) 
    {
        this.allWeapons = allWeapons;
    }

    public void Attack(string target) 
    {
        foreach (IWeapon weapon in this.allWeapons)
            Console.WriteLine(weapon.Hit(target));
    }
}
We can create bindings from the IWeapon interface to the Sword and Dagger types.

class TestModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind().To();
        Bind().To();
    }
}
Finally, a kernel is created with the module we defined above. We ask Ninject for an instance of a Samurai. Now, when you ask the Samurai to attack, you will see it has been given an array of all the types bound to IWeapon.

class Program
{
    public static void Main() 
    {
        Ninject.IKernel kernel = new StandardKernel(new TestModule());

        var samurai = kernel.Get();
        samurai.Attack("your enemy");
    }
}
And you’ll see:

Stab your enemy to death
Slice your enemy in half
The kernel also exposes a GetAll method which lets you generate the same output by doing:

class Program
{
    public static void Main() 
    {
        Ninject.IKernel kernel = new StandardKernel(new TestModule());

        IEnumerable weapons = kernel.GetAll();
        foreach(var weapon in weapons)
            Console.WriteLine(weapon.Hit("the evildoers"));
    }
}
Continue reading: Object Scopes

Enkari
Ninject is the illegitimate brainchild of Nate Kohari. Copyright ©2007-2012 Enkari, Ltd and the Ninject project contributors.
1 голос
/ 08 апреля 2010

Проблема в том, что вы назначаете один интерфейс двум реализациям без какой-либо условной логики.Применяемая вами логика применяется только к тем методам, которые вводятся.Ninject не знает, какую привязку использовать, поскольку вы указываете, что они обе по умолчанию.

...