के साथ एक इंटरफ़ेस के लिए एकाधिक कार्यान्वयन अभी मैं ऑटोफैक से आईओसी-कंटेनर के साथ निर्भरता इंजेक्शन पैटर्न को सिखाने की कोशिश कर रहा हूं। मैं एक बहुत ही सरल उदाहरण के साथ आया हूं, जो नीचे प्रस्तुत किया गया है। हालांकि उदाहरण सरल है, मैं इसे ठीक से काम करने में विफल रहता हूं।DI
दो राक्षस, दोनों IMonster इंटरफेस को लागू करने:
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();
}
}
और अंत में अपने मुख्य:
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!");
}
}
फिर मेरे कब्रिस्तान है
यहाँ मेरी कक्षाओं/इंटरफ़ेस हैं
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 नहीं ले जाएगा।
क्या इसे ठीक करने का कोई आसान तरीका है? या क्या मुझे ऑटोफैक पूरी तरह से गलत तरीके से काम करने का तरीका मिला? आप इस समस्या को कैसे हल करेंगे?
मुझे लगता है कि आप [नाम सेवाएं] की तलाश में हो सकता है (https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)। –
ग्रेफार्ड कक्षा में दो कन्स्ट्रक्टर तर्कों को हल करने वाले ऑटोफैक कैसे हैं? – MattDavey
मैटडेवी का सही जवाब है। लगता है कि संकल्पक दोनों को कन्स्ट्रक्टर के लिए Func और Func का विशेष रूप से नहीं मिल सकता है, इस प्रकार शून्य के साथ प्रतिस्थापित करें। शायद रिज़ॉल्वर में दोनों func को पंजीकृत करने से समस्या –
Fendy