Несколько реализаций для одного интерфейса с DI
Прямо сейчас яЯ пытаюсь научить себя шаблону внедрения зависимостей с помощью IOC-контейнера от Autofac. Я'Мы придумали очень простой пример, который представлен ниже. Хотя пример прост, я не могу заставить его работать должным образом.
Вот мои классы / интерфейсы:
Два монстра, оба реализуют интерфейс IMonster:
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!");
}
}
То есть'Мое кладбище:
interface ILocation
{
void PresentLocalCreeps();
}
class Graveyard : ILocation
{
Func mVampireFactory;
Func mZombieFactory;
public Graveyard(Func vampireFactory, Func zombieFactory)
{
mVampireFactory = vampireFactory;
mZombieFactory = zombieFactory;
}
public void PresentLocalCreeps()
{
var vampire = mVampireFactory.Invoke(300);
vampire.IntroduceYourself();
var zombie = mZombieFactory.Invoke("Rob");
zombie.IntroduceYourself();
}
}
И напоследок мой главный:
static void Main(string[] args)
{
// Setup Autofac
var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
var container = builder.Build();
// It's midnight!
var location = container.Resolve();
location.PresentLocalCreeps();
// Waiting for dawn to break...
Console.ReadLine();
container.Dispose();
}
И это моя проблема: во время выполнения Autofac выдает исключение в этой строке:
var vampire = mVampireFactory.Invoke(300);
Кажется, что mVampireFactory на самом деле пытается создать зомби. Конечно это победилоне работает с зомбиконструктор выигралвзять инт.
Есть ли простой способ это исправить? Или я понял, что Autofac работает совершенно неправильно? Как бы вы решили эту проблему?