Использование Registry в StructureMap для создания подключаемой архитектуры - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть веб-проект, и я хочу, чтобы он работал со встроенными ravendb и ravendb.Вот как я думаю, я должен решить эту проблему.

Два проекта, 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();
       }
    }
 }

Итак, как я могу сказать structmap использовать InitializeDocumentStore из класса RavenRegistry?Может быть, я что-то упустил, или я выбрал неправильный подход

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Просто используйте экземпляр EmbeddableDocumentStore, используя строку подключения, вы можете управлять всем, что будет встроено, или сервером / клиентом.

0 голосов
/ 15 сентября 2011

Это должно сделать, как вы хотите. В 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());
        });
...