简体   繁体   English

结构 map 初始化和多个 Visual Studio 项目

[英]Structure map Initialization and multiple Visual Studio projects

I use Structure Map (version 4.7) in my VS 2019 Solution where I have 8 projects like (sub modules) and 1 main ASP.NET MVC5 project.我在我的 VS 2019 解决方案中使用 Structure Map(版本 4.7),其中我有 8 个项目(如(子模块)和 1 个主要 ASP.NET MVC5 项目)。


All Projects are written in C#, and main StructureMap file DefaultRegistry I have in this MVC project, which calls Facades od each project and use them on the web presentation.所有项目都是用 C# 编写的,我在这个 MVC 项目中拥有主 StructureMap 文件 DefaultRegistry,它调用每个项目的 Facades 并在 web 演示文稿中使用它们。

There is an example of 1 module in this file:此文件中有 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();

And parts like this I have 8 before then I split 1 project to these sob modules, I have only less than 20 rows, and others interfaces found and load automatically, but now I must write each dependency into structure map definition file like this像这样的部分我之前有 8 个,然后我将 1 个项目拆分为这些 sob 模块,我只有不到 20 行,其他接口自动找到并加载,但现在我必须将每个依赖项写入结构 map 定义文件,如下所示

Is there any solution on how to do it better, simple, shorter and more nice??有没有关于如何做得更好、更简单、更短、更漂亮的解决方案?

Thank you谢谢

You could use the Registry functionality of StructureMap: https://structuremap.github.io/registration/registry-dsl/您可以使用 StructureMap 的注册表功能: https://structuremap.github.io/registration/registry-dsl/

So each of the class libraries have a structure map registry and this registry for each class library configures your dependencies, you should just be using default conventions so you don't have to configure each and every dependency.因此,每个 class 库都有一个结构 map 注册表,每个 class 库的此注册表配置您的依赖项,您应该只使用每个默认依赖项约定,因此您不必配置每个和

In the mvc5 website tell structure map to scan for registries in your class lib assemblies next to the other configurations you have made.在 mvc5 网站中,告诉结构 map 扫描您的 class 库程序集中的注册表,并在您所做的其他配置旁边。

Thats all you really need to do.这就是你真正需要做的。

Yes you can get what you want through Reflection ,beside your business take a look at codes below是的,您可以通过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 is name of project that your your classes and interfaces that are supposed to be injected exist and @namespace as it's name implies is namespace of your contracts (Interfaces) assemblyName是项目的名称,您的应该注入的类和接口存在, @namespace顾名思义是合同的命名空间(接口)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM