在StructureMap中使用Registry来创建可插入的体系结构

时间:2011-09-15 11:34:10

标签: c# architecture structuremap ravendb

我有一个网络项目,我希望它能与ravendb和ravendb-embedded一起使用。 所以这就是我认为我应该解决的问题。

两个项目,MvcRavendb和MvcRavendb-Embedded,其中两个项目引用了两个不同的nuget包,一个用于ravendb,另一个用于ravendb嵌入。

在我的核心项目中,我有一个接口IDocumentStoreInitializer,它有一个方法,IDocumentStore InitializeDocumentStore()

MvcRavenDb和MvcRavenDb-Embedded有一个这样的类

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

然后我有一个类来记录这个具体的实现

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

到目前为止一直很好,但后来我有了像这样配置结构图的引导程序

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

那么如何告诉structuremap使用RavenRegistry类中的InitializeDocumentStore? 也许我错过了一些东西或者我在这里采取了错误的方法

2 个答案:

答案 0 :(得分:1)

只需使用EmbeddableDocumentStore实例,使用连接字符串,即可控制嵌入的内容或服务器/客户端。

答案 1 :(得分: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());
        });