Карта структуры Инициализация и несколько проектов Visual Studio - PullRequest
1 голос
/ 23 сентября 2019

Я использую Карту структуры (версия 4.7) в своем решении VS 2019, где у меня есть 8 проектов, таких как (подмодули) и 1 основной проект ASP.NET MVC5.


Все проекты написаны на C #, а основной файл StructureMap DefaultRegistry у меня есть в этом проекте MVC, который вызывает Фасады для каждого проекта и использует их в веб-презентации.

В этом файле приведен пример 1 модуля:

// Initialize log4net.
            XmlConfigurator.Configure();

            Scan(
                scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                    scan.With(new ControllerConvention());
                });

            // Log
            For<ILog>().Use(c => LogManager.GetLogger(GetType())).Singleton();

// Extruder 
            For<Project1.Repositories.ILibraryRepository>().Use<Project1.Repositories.LibraryRepository>().Singleton();
            For<Project1.Repositories.IExtruderRepository>().Use<Project1.Repositories.ExtruderRepository>().Singleton();
            For<Project1.Repositories.IProductSeriesRepository>().Use<Project1.Repositories.ProductSeriesRepository>().Singleton();
            For<Project1.Repositories.IRepositoryLogger>().Use<Project1.Repositories.RepositoryLogger>().Singleton();
            For<Project1.Repositories.IDynamicMasterCoefRepository>().Use<Project1.Repositories.DynamicMasterCoefRepository>().Singleton();
            For<Project1.Repositories.IDynamicTemperatureCoefsRepository>().Use<Project1.Repositories.DynamicTemperatureCoefsRepository>().Singleton();
            For<Project1.Repositories.IDynamicTimeCoefsRepository>().Use<Project1.Repositories.DynamicTimeCoefsRepository>().Singleton();
            For<Project1.Repositories.IDynamicVacCoefsRepository>().Use<Project1.Repositories.DynamicVacCoefsRepository>().Singleton();
            For<Project1.Repositories.IPowerDissipationCoefsRepository>().Use<Project1.Repositories.PowerDissipationCoefsRepository>().Singleton();
            For<Project1.Repositories.ISubsidiaryRepository>().Use<Project1.Repositories.SubsidiaryRepository>().Singleton();
            For<Project1.Repositories.ITechnologyRepository>().Use<Project1.Repositories.TechnologyRepository>().Singleton();
            For<Project1.Repositories.ITemperaturesRepository>().Use<Project1.Repositories.TemperaturesRepository>().Singleton();
            For<Project1.Repositories.ISerieFileRepository>().Use<Project1.Repositories.SerieFileRepository>().Singleton();

            For<Project1.Services.IProductSeriesService>().Use<Project1.Services.ProductSeriesService>().Singleton();
            For<Project1.Services.IExtruderService>().Use<Project1.Services.ExtruderService>().Singleton();
            For<Project1.Services.IProductService>().Use<Project1.Services.ProductService>().Singleton();
            For<Project1.Services.ILineService>().Use<Project1.Services.LineService>().Singleton();
            For<Project1.Services.ISerieFileService>().Use<Project1.Services.SerieFileService>().Singleton();
            For<Project1.Services.ICsvFileService>().Use<Project1.Services.CsvFileService>().Singleton();
            For<Project1.Services.IDynamicService>().Use<Project1.Services.DynamicService>().Singleton();
            For<Project1.Services.IPdfFileService>().Use<Project1.Services.PdfFileService>().Singleton();
            For<Project1.Services.ISParametersService>().Use<Project1.Services.SParametersService>().Singleton();
            For<Project1.Services.IGenModelService>().Use<Project1.Services.GenModelService>().Singleton();
            For<Project1.Services.IStpFileService>().Use<Project1.Services.StpFileService>().Singleton();

            For<Project1.Facades.IControllerFacade>().Use<Project1.Facades.ControllerFacade>().Singleton();
            For<Project1.Facades.IDownloadFacade>().Use<Project1.Facades.DownloadFacade>().Singleton();

И таких частей у меня есть 8 до того, как я разделил 1 проект на эти модули sob,У меня только менее 20 строк, другие интерфейсы найдены и загружены автоматически, но теперь я должен записать каждую зависимость в файл определения структурной карты следующим образом

Есть ли решение, как сделать это лучше, проще, корочеи еще приятно ??

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Да, вы можете получить то, что вы хотите через Reflection, кроме вашего бизнеса посмотрите на коды ниже

 void RegisterAllIncludedInterfaces(string assemblyName, string @namespace)
    {
        System.Reflection.Assembly
            .Load(assemblyName)
            .GetTypes()
            .Where(t => t.GetInterfaces().Any(i => i.Namespace == @namespace))
            .ToList()
            .ForEach(t =>
            {
                For(t.GetInterfaces().Single(i => i.Namespace == @namespace))
               .HybridHttpOrThreadLocalScoped()
               .Use(t);
            });
    }

assemblyName - это название проекта, который ваши классы и интерфейсы, которые должныбыть внедренным, существует и @namespace, как следует из названия, является пространством имен ваших контрактов (интерфейсов)

0 голосов
/ 23 сентября 2019

Вы можете использовать функциональность реестра StructureMap: https://structuremap.github.io/registration/registry-dsl/

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

На веб-сайте mvc5 укажите структурную карту для сканирования реестров в ваших сборках классов lib рядом с другими выполненными вами конфигурациями.

Вот и все, что тебе действительно нужно сделать.

...