StructureMap插件,在注册时调用init方法

时间:2010-03-02 16:34:44

标签: structuremap

我正在探索使用StructureMap使用“扫描”功能从特定目录加载我的插件类型IPlugin的所有实例的可能性。

当一个插件注册到StructureMap时,我想调用一个Init方法,如果它是第一次被看到,它会在数据库中注册该插件。

有没有办法通过注册的IPlugins“foreach”,获取引用并在每个引用上调用Init?

我的目标是安装拖放插件。

谢谢,

伊恩

2 个答案:

答案 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。最后,您可以使用扫描仪添加所需的插件类型。