今、私はAutofacのIOCコンテナを使用して依存性注入パターンを自分自身で教えようとしています。私は以下に示す非常に簡単な例を思いついた。この例は単純ですが、正しく動作させることはできません。DIとの1つのインターフェイスに対する複数の実装
二つのモンスター、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<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();
}
}
そして最後に私のメイン:
ここは私のクラス/インタフェースは、
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();
}
そして、これは私の問題である:実行時に 、Autofacは、この行の例外をスロー:
var vampire = mVampireFactory.Invoke(300);
mVampireFactoryが実際にゾンビをインスタンス化しようとしているようです。もちろん、これは動作しません。なぜなら、ゾンビのコンストラクタはintを取らないからです。
これを解決する簡単な方法はありますか? また、オートファックの動作が完全に間違っていましたか? この問題をどうやって解決しますか?
あなたは[Named Services](https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)を探している可能性があります。 –
autofacは、墓地のクラスに対する2つのコンストラクタ引数をどのように解決しますか? – MattDavey
MattDaveyに正解があります。リゾルバが両方のコンストラクタのためにFuncとFunc の特定を見つけることができないように見えるので、nullに置き換えます。おそらくfuncの両方をリゾルバに登録すると問題が解決する可能性があります –
Fendy