замена конфигурации StructureMap значениями из памяти - PullRequest
0 голосов
/ 25 мая 2011

Я использую StructureMap для IoC, сейчас получаю конфигурацию из App.Config, например так:

   public class ImplementationFactory
{
    private static volatile ImplementationFactory Factory;
    private static object syncRoot = new Object();

    private ImplementationFactory()
    {
    }
    public static ImplementationFactory Instance
    {
        get
        {
            if (Factory == null)
            {
                lock (syncRoot)
                {
                    if (Factory == null)
                    {
                        Factory = new ImplementationFactory();
                    }
                }
            }
            return Factory;
        }
    }
    Programmer prog;
    public Contracts.IImplementation GetImplementation()
    {
        if (this.prog == null)
        {
            ObjectFactory.Initialize(x => x.PullConfigurationFromAppConfig = true);
            prog = ObjectFactory.GetInstance<Programmer>();
        }

        return prog.Implementation;
    }

}
[Pluggable("Default")]
[PluginFamily("Default")]
internal class Programmer
{
    public readonly Contracts.IImplementation Implementation;

    public Programmer(Contracts.IImplementation Implementation)
    {
        Implementation = Implementation;
    }

}

сейчас вместо предоставления двух имен сборок с помощью App.Config. Я хочу просто предоставить их с помощью кода, подобногоиз переменных, любая идея, как я могу изменить свой код, чтобы сделать это?

1 Ответ

0 голосов
/ 25 мая 2011

Вот решение:

сначала создайте свой собственный реестр, который наследует расширение Registry:

  internal class MyRegistery : Registry
{
    /// of course here you can find a way to provide the name (maybe from db)
    private string myassembly = "urAssembly.dll";
    public MyRegistery()
    {
        Scan(
      scanner =>
      {
          scanner.AssembliesFromApplicationBaseDirectory(x => x.ManifestModule.Name== myassembly);
          scanner.AddAllTypesOf<Contracts.IImplementation >();
      });
    }
}

теперь вам нужно инициализировать контейнер (замените код в вопросе на этот):

            if (this._prog == null)
            {
//                ObjectFactory.Initialize(x => x.PullConfigurationFromAppConfig = true);
                ObjectFactory.Initialize(x => {
                x.AddRegistry<MyRegistery>();
                });
            }

это должно работать ...

...