Как настроить StructureMap? - PullRequest
       9

Как настроить StructureMap?

1 голос
/ 01 сентября 2011

На AppEngine "Franch" и "English" как инъекция зависимостей, что мне делать?

class Program
{
    static void Main(string[] args)
    {
        IContainer container = ConfigureDependencies();

        IAppEngine appEngine = container.GetInstance<IAppEngine>();

        IGeeter g1 = container.GetInstance<IGeeter>("Franch");
        IGeeter g2 = container.GetInstance<IGeeter>("English");

        appEngine.Run();



    }

    private static IContainer ConfigureDependencies()
    {


        return new Container(x =>
            {                    
                x.For<IGeeter>().Add<FrenchGreeter>().Named("Franch");
                x.For<IGeeter>().Add<EnglishGreeter>().Named("English"); 

                x.For<IAppEngine>().Use<AppEngine>(); 

                x.For<IGeeter>().Use<EnglishGreeter>();
                x.For<IOutputDisplay>().Use<ConsoleOutputDisplay>();

            });
    }

}

public interface IAppEngine
{
    void Run();
}

public interface IGeeter
{
    string GetGreeting();
}
public interface IOutputDisplay
{
    void Show(string message);
}

public class AppEngine : IAppEngine
{
    private readonly IGeeter english;
    private readonly IGeeter franch;
    private readonly IOutputDisplay outputDisplay;

    public AppEngine(IGeeter english,IGeeter franch, IOutputDisplay outputDisplay)
    {
        this.english = english;
        this.franch = franch;
        this.outputDisplay = outputDisplay;

    }

    public void Run()
    {
        outputDisplay.Show(greeter.GetGreeting());
    }
}

public class EnglishGreeter : IGeeter
{
    public string GetGreeting()
    {
        return "Hello";
    }
}

public class FrenchGreeter : IGeeter
{
    public string GetGreeting()
    {
        return "Bonjour";
    }
}

1 Ответ

3 голосов
/ 01 сентября 2011

Поскольку контракты для FrenchGreeter и EnglishGreeter одинаковы, StructureMap не будет знать, какой из них использовать. Для каждой проводки он использует только один экземпляр на контракт. Попробуйте что-то вроде этого:

For<IGreeter>().Use<FrenchGreeter>().Named("French");
For<IGreeter>().Use<EnglishGreeter>().Named("English");
For<IAppEngine>().Use<AppEngine>()
  .Ctor<IGreeter>("French").Is(x => x.TheInstanceNamed("French"))
  .Ctor<IGreeter>("English").Is(x => x.TheInstanceNamed("English"));
...