3

В настоящее время у нас есть 2 веб-приложения, один из которых является лицом, обращенным к клиенту, а другой - административным бэкэнд-приложением. Мы заметили, что большое количество дубликатов между двумя приложениями дублируется. Пример, установка RavenDb. Например оба приложения имеют этот код в asp.net global.asaxПовторное использование регистраций с установщиками Castle Windsor?

 container.Register(
      Component.For<IDocumentStore>() 
       .UsingFactoryMethod(x => 
       { 
        var docStore = new DocumentStore { ConnectionStringName = "RavenDB" }; 
        docStore.Initialize(); 
        return docStore; 
       }).LifestyleSingleton() 
      ); 

Мы реструктурировать этот код из в инсталлятор и поместили его в сборке под названием CastleWindsor.RavenDbInstaller, который можно ссылаться и повторно обоими приложениями.

public class RavenDbInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IDocumentStore>() 
       .UsingFactoryMethod(x => 
       { 
        var docStore = new DocumentStore { ConnectionStringName = "RavenDB" }; 
        docStore.Initialize(); 
        return docStore; 
       }).LifestyleSingleton() 
      ); 
    } 
} 

Все это хорошо, но это рекомендуемый подход к повторному использованию регистрации логики между приложениями ??

Кроме того, что происходит, когда установщик в отдельной сборке имеет зависимость от другого класса. Как это должно быть обработано. Например, что, если моя строка соединения ravendb не должна быть жестко запрограммирована и должна быть присоединена к классу ApplicationConfiguration. Как я могу справиться с этой зависимостью в отношении моей сборки CastleWindsor.RavenDbInstaller и содержащегося в ней класса установщика?

public class RavenDbInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IDocumentStore>() 
       .UsingFactoryMethod((c, y) => 
       { 
        var connectionStringName = c.Resolve<IApplicationConfiguration>().ConnectionStringName; // <---- How do i deal with this dependency? 
        var docStore = new DocumentStore { ConnectionStringName = connectionStringName }; 
        docStore.Initialize(); 
        return docStore; 
       }).LifestyleSingleton() 
      ); 
    } 
} 
+0

Вы нашли удовлетворительное решение вашей проблемы? – samy

ответ

0

, если вы хотите использовать один и тот же для IApplicationConfiguration реализация для внутреннего интерфейса и интерфейса, то это имеет смысл поместить его в CastleWindsor.RavenDbInstaller Ассамблее. В противном случае нет. Cheers.

0

Лично я оставил установщика в сборке, где указаны его компоненты. Вы не разрешите компонент, который вы не устанавливаете, или разрешите компонент, который вы не используете, поэтому разделение обоих элементов на самом деле не имеет для меня смысла. Оба приложения должны ссылаться на бизнес-компонент, который использует RavenDB, а также содержит элементы установки.

Что касается вашей ссылки на строку подключения, я бы порекомендовал добавить пользовательскую настройку resolver к вашей установке замка, которая сможет разрешить вашу строку соединения из любого источника, который вам нужен: это позволяет вам разрешить строку подключения в установщике, не имея ссылка на внешние компоненты. Еще один бонус заключается в том, что если вы не регистрируете способ разрешить строку соединения, вам не нужно обрабатывать ошибки, разрешение будет явно недействительным с именем строки подключения.

public class ConnectionStringResolver : ISubDependencyResolver 
{ 
    public bool CanResolve(Castle.MicroKernel.Context.CreationContext context, ISubDependencyResolver contextHandlerResolver, Castle.Core.ComponentModel model, Castle.Core.DependencyModel dependency) 
    { 
     var connectionStringInformation = ConfigurationManager.ConnectionStrings[dependency.DependencyKey]; 

     return connectionStringInformation != null 
      && !string.IsNullOrEmpty(connectionStringInformation.ConnectionString) 
       && 
       TypeDescriptor.GetConverter(dependency.TargetType) 
       .CanConvertFrom(typeof(string)); 
    } 

    public object Resolve(Castle.MicroKernel.Context.CreationContext context, ISubDependencyResolver contextHandlerResolver, Castle.Core.ComponentModel model, Castle.Core.DependencyModel dependency) 
    { 
     return TypeDescriptor 
      .GetConverter(dependency.TargetType) 
      .ConvertFrom(ConfigurationManager.ConnectionStrings[dependency.DependencyKey].ConnectionString); 
    } 
} 

Затем установщик будет:

public void Install(IWindsorContainer container, IConfigurationStore store) 
{ 
    container.Register(
     Component.For<IDocumentStore>() 
      .UsingFactoryMethod((c, y) => 
      { 
       var connectionStringName = container.Resolve("TheConnectionString"); 
       var docStore = new DocumentStore { ConnectionStringName = connectionStringName }; 
       docStore.Initialize(); 
       return docStore; 
      }).LifestyleSingleton() 
     ); 
} 
Смежные вопросы