我正在探索使用StructureMap使用“扫描”功能从特定目录加载我的插件类型IPlugin
的所有实例的可能性。
当一个插件注册到StructureMap时,我想调用一个Init方法,如果它是第一次被看到,它会在数据库中注册该插件。
有没有办法通过注册的IPlugins“foreach”,获取引用并在每个引用上调用Init?
我的目标是安装拖放插件。
谢谢,
伊恩
答案 0 :(得分:3)
您可以使用容器外的Model属性轻松查看为容器配置的所有插件。以下是强烈关注的示例。这可能不是你想要的。这只是我梦想初始化你在容器中注册的东西的几种方式的一个例子。
public interface IInitable
{
void Init();
bool Inited { get; }
}
public abstract class Initable : IInitable
{
public bool Inited { get; private set; }
public void Init()
{
Inited = true;
}
}
public class Initable1 : Initable { }
public class Initable2 : Initable { }
[TestFixture]
public class accessing_the_container_model
{
[Test]
public void put_things_in_and_init_then_during_construction()
{
var container = new Container(cfg =>
{
cfg.For<IInitable>().Use(c =>
{
var initable = c.GetInstance<Initable1>();
initable.Init();
return initable;
});
});
container.GetAllInstances<IInitable>().Each(i => i.Inited.ShouldBeTrue());
}
[Test]
public void put_things_in_and_init_them()
{
var container = new Container(cfg =>
{
cfg.For<IInitable>().HybridHttpOrThreadLocalScoped().Add<Initable1>();
cfg.For<IInitable>().HybridHttpOrThreadLocalScoped().Add<Initable2>();
});
foreach (var instance in container.Model.GetAllPossible<IInitable>())
{
instance.Init();
}
container.GetAllInstances<IInitable>().Each(i=>i.Inited.ShouldBeTrue());
}
}
答案 1 :(得分:2)
使用装配扫描仪是创建插件模型的好方法。
public class StructuremapBootstrap
{
public IContainer Container { get; private set; }
public StructuremapBootstrap()
{
Container = new Container(x =>
{
//add registries here or do your config.
//extensibility
x.Scan(scan =>
{
//some plugin discriminator
scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.Contains("Plugin"));
scan.LookForRegistries();
scan.AddAllTypesOf<IInitable>();
});
});
}
}
你基本上告诉StructureMap查找具有特定鉴别器的所有程序集,我还使用了标记程序集属性。 LookForRegistries 扫描程序非常方便您的插件程序集可以随意配置StructureMap。最后,您可以使用扫描仪添加所需的插件类型。