2010-03-02 30 views
2

我在探索使用StructureMap从使用扫描功能的特定目录加载我的插件类型IPlugin的所有实例的可能性。StructureMap插件,在注册时调用init方法

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

有没有一种方法可以通过注册的IPlugins“foreach”,获得一个引用,并在每一个调用Init?

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

感谢,

伊恩

+0

你能通过拖放来探索更多你的意思吗?你的意思是将程序集放在监视目录上吗?你的意思是在运行时注册基于用户输入的容器中的类型?只是好奇。 – KevM 2010-03-02 16:53:34

+0

当然。我最初的想法是能够将插件放置在目录中,并在应用程序重新启动时自动注册。我可能想在未来扩展到一个观看目录。 – madcapnmckay 2010-03-03 08:34:24

+0

我在我的一个应用程序中执行此操作。我会用一些示例代码抛出另一个答案。 – KevM 2010-03-03 14:13:47

回答

3

你可以轻松地查看哪个配置为使用模型属性从容器容器中的所有插件。以下是强烈警示的示例。这可能不是你正在寻找的东西。这只是我梦想初始化您在容器中注册的事物的几种方法的一个例子。

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()); 
    } 
} 
+0

这是一个很好的起点。感谢您的详细解答。 – madcapnmckay 2010-03-03 08:35:33

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。最后,您将扫描仪添加您所需的插件类型。