Mehrere Implementierungen für eine Schnittstelle mit DI

Im Moment versuche ich mir das Dependency Injection Pattern mit dem IOC-Container von Autofac beizubringen. Ich habe ein sehr einfaches Beispiel entwickelt, das im Folgenden vorgestellt wird. Obwohl das Beispiel einfach ist, kann ich es nicht richtig zum Laufen bringen.

Hier sind meine Klassen / Interfaces:

Zwei Monster, die beide die IMonster-Oberfläche implementieren:

interface IMonster
{
  void IntroduceYourself();
}

class Vampire : IMonster
{
  public delegate Vampire Factory(int age);

  int mAge; 

  public Vampire(int age)
  {
    mAge = age;
  }

  public void IntroduceYourself()
  {
    Console.WriteLine("Hi, I'm a " + mAge + " years old vampire!");
  }
}

class Zombie : IMonster
{
  public delegate Zombie Factory(string name);

  string mName;

  public Zombie(string name)
  {
    mName = name;
  }

  public void IntroduceYourself()
  {
    Console.WriteLine("Hi, I'm " + mName + " the zombie!");
  }
}

Dann ist da noch mein Friedhof:

interface ILocation
{
  void PresentLocalCreeps();
}

class Graveyard : ILocation
{
  Func<int, IMonster>    mVampireFactory;
  Func<string, IMonster> mZombieFactory;

  public Graveyard(Func<int, IMonster> vampireFactory, Func<string, IMonster> zombieFactory)
  {
    mVampireFactory = vampireFactory;
    mZombieFactory  = zombieFactory;
  }

  public void PresentLocalCreeps()
  {
    var vampire = mVampireFactory.Invoke(300);
    vampire.IntroduceYourself();

    var zombie = mZombieFactory.Invoke("Rob");
    zombie.IntroduceYourself();
  }
}

Und zum Schluss mein Haupt:

static void Main(string[] args)
{
  // Setup Autofac
  var builder = new ContainerBuilder();
  builder.RegisterType<Graveyard>().As<ILocation>();
  builder.RegisterType<Vampire>().As<IMonster>();
  builder.RegisterType<Zombie>().As<IMonster>();
  var container = builder.Build();

  // It's midnight!
  var location = container.Resolve<ILocation>();
  location.PresentLocalCreeps();

  // Waiting for dawn to break...
  Console.ReadLine(); 
  container.Dispose();
}

Und das ist mein Problem: Während der Laufzeit löst Autofac eine Ausnahme in dieser Zeile aus:

var vampire = mVampireFactory.Invoke(300);

Es scheint, dass die mVampireFactory tatsächlich versucht, einen Zombie zu instanziieren. Dies funktioniert natürlich nicht, da der Konstruktor des Zombies kein int akzeptiert.

Gibt es eine einfache Möglichkeit, dies zu beheben? Oder habe ich die Funktionsweise von Autofac völlig falsch verstanden? Wie würden Sie dieses Problem lösen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage