2010-03-02 31 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。最後,您將掃描儀添加您所需的插件類型。