Использование StructureMap для внедрения двух разных компонентов во время выполнения одновременно - PullRequest
0 голосов
/ 03 августа 2011

У меня есть этот класс, чтобы использовать для получения экземпляров объектов из разных DLL в зависимости от строки, которая имеет имя DLL.

public class PluginFactory
{
private static volatile PluginFactory Factory;

private static object syncRoot = new Object();

private PluginFactory()
{
}
public static PluginFactory Instance
{
    get
    {
        if (Factory == null)
        {
            lock (syncRoot)
            {
                if (Factory == null)
                {
                    Factory = new PluginFactory();
                }
            }
        }
        return Factory;
    }
}
public IPlugableInterface GetPlugin(string assemblyName)
{
    ObjectFactory.Initialize(x => x.AddRegistry(new PluginRegistery(assemblyName)));
    _prog = ObjectFactory.GetInstance<PluginProgrammer>();
    return _prog.Plugin;
}

PluginProgrammer _prog;
[Pluggable("Default")]
[PluginFamily("Default")]
internal class PluginProgrammer
{
    public readonly IPlugableInterface Plugin;
    public PluginProgrammer(IPlugableInterface Plugin)
    {
        this.Plugin = Plugin;
    }
}

internal class PluginRegistery : Registry
{
    public PluginRegistery(string assembly)
    {
        Scan(
      scanner =>
      {
          scanner.AssembliesFromApplicationBaseDirectory(x => x.ManifestModule.Name == assembly);
          scanner.AddAllTypesOf<IPlugableInterface>();
      });
    }
}
}

Это отлично работает для первого вызова, оно внедряется в DLL, которая имеет свое имя в качестве имени сборки, и возвращает объект этого объекта, во второй раз, когда я вызываю ее с другим именем сборки, она не работает и не возвращает объект Самое смешное, что он никогда не проходит эту строку, если я отлаживаю и если я запускаю его без точки останова, ничего не происходит!

_prog = ObjectFactory.GetInstance<PluginProgrammer>();

есть идеи, почему это происходит? Любая идея, как я могу это исправить или перепроектировать, чтобы выполнить то, что я хочу?

1 Ответ

0 голосов
/ 03 августа 2011

Я думаю, что вы должны использовать именованные экземпляры, так как вы хотите иметь разные регистрации в разных DLL. Например, вы можете использовать имя dll в качестве имени экземпляра.

Смотри также: http://geekswithblogs.net/michelotti/archive/2009/10/14/structuremap-with-named-instance-and-with-method.aspx

...