2011-09-15 44 views
2

我有一個Web項目,我希望它與ravendb和ravendb嵌入式工作。所以這就是我認爲我應該解決的問題。在StructureMap使用註冊表來創建一個可插拔architechture

兩個項目,MvcRavendb和MvcRavendb-Embedded,其中兩個項目引用兩個不同的nuget包,一個用於ravendb,一個用於嵌入ravendb。

在我的核心項目,我有一個接口IDocumentStoreInitializer其中有一個方法,IDocumentStore InitializeDocumentStore()

MvcRavenDb和MvcRavenDb,內嵌有一類這樣的

public class RegisterRavenDb : IDocumentStoreInitializer { 
    public IDocumentStore InitializeDocumentStore() { 
     return new DocumentStore OR EmbeddableDocumentStore(); 
    } 
} 

然後我有一個註冊類這樣的具體實現

public class RavenRegistry : Registry { 
    public RavenRegistry() { 
     For<IDocumentStoreInitializer>().Use<RegisterRavenDb>(); 
    } 
} 

到目前爲止這麼好,但後來我有bootstrapper配置stru cturemap像這樣

public class Bootstrapper { 
    public static IContainer Initialize() { 
     ObjectFactory.Initialize(x => 
     { 
      // here I want to use the registered concrete implmentaiton of IDocumentStore 
      var documentStore = new DocumentStore { ConnectionStringName = "RavenDB" }; 

      documentStore.Initialize(); 
     } 
    } 
} 

那麼我怎樣才能告訴結構圖從RavenRegistry類使用InitializeDocumentStore? 也許我錯過了一些東西還是我採取了錯誤的方式在這裏

回答

1

只需使用EmbeddableDocumentStore實例,使用連接字符串,即可控制將嵌入的任何內容或服務器/客戶端。

+0

沒關係啊我明白了,謝謝! – Marcus

+0

我是否需要添加NuGet包兩個RavenDB和RavenDB,嵌入式?當我嘗試使用connectionstring Url = http:// localhost:8080創建EmbeddableDocumentStore時,它將返回null。 – Marcus

+0

似乎embeddabledocumentstore不能用connectionstringname初始化?如果我在創建它的實例時直接使用URL或DataDirectory。 – Marcus

0

,你想這應該做的。在OnCreation ConnectionString中可以設置了。

 ObjectFactory.Initialize(x => 
     { 
      // here I want to use the registered concrete implmentaiton of IDocumentStore 
      x.Scan(scan => 
         { 
          scan.TheCallingAssembly(); 
          scan.AssembliesFromApplicationBaseDirectory(); 
          scan.LookForRegistries(); 
         }); 

      x.For<IDocumentStore>().Use(c => 
       c.GetInstance<IDocumentStoreInitializer>(). 
        InitializeDocumentStore()).OnCreation<IDocumentStore>(z => z.Initialize()); 
     });