C# 结构图初始化和多个Visual Studio项目

C# 结构图初始化和多个Visual Studio项目,c#,asp.net-mvc,structuremap,C#,Asp.net Mvc,Structuremap,我在VS2019解决方案中使用结构图(版本4.7),其中我有8个项目,如(子模块)和1个主ASP.NET MVC5项目 所有的项目都是用C#编写的,我在这个MVC项目中有一个主结构映射文件DefaultRegistry,它调用每个项目的Facades并在web演示中使用它们 此文件中有一个模块示例: // Initialize log4net. XmlConfigurator.Configure(); Scan(

我在VS2019解决方案中使用结构图(版本4.7),其中我有8个项目,如(子模块)和1个主ASP.NET MVC5项目


所有的项目都是用C#编写的,我在这个MVC项目中有一个主结构映射文件DefaultRegistry,它调用每个项目的Facades并在web演示中使用它们

此文件中有一个模块示例:

// 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();
//初始化log4net。
XmlConfigurator.Configure();
扫描(
扫描=>
{
扫描。卡入总成();
scan.WithDefaultConventions();
使用(新的ControllerConvention())扫描;
});
//日志
For()。使用(c=>LogManager.GetLogger(GetType()).Singleton();
//挤出机
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
For().Use().Singleton();
像这样的部分我之前有8个,然后我将1个项目拆分到这些sob模块中,我只有不到20行,其他接口会自动找到并加载,但现在我必须像这样将每个依赖项写入结构映射定义文件中

有没有什么办法可以让它变得更好、更简单、更短、更漂亮


谢谢

您可以使用StructureMap的注册表功能:

所以每个类库都有一个结构映射注册表,这个注册表为每个类库配置依赖项,您应该只使用默认约定,这样就不必配置每个依赖项

在mvc5网站中,告诉structure map在您所做的其他配置旁边的类库程序集中扫描注册表


这就是你真正需要做的。

是的,你可以通过
反射
得到你想要的,在你的业务旁边,看看下面的代码

 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
顾名思义是合同(接口)的名称空间,如果您的代码有效,并且您寻求改进或建设性的批评,可能会更好地适合您的问题。您可以考虑使用带有ExpTeXT属性的类反射标记类型进行注册,然后使用反射和注册来查找这些类。据我所知,MEF支持这一点,但我不知道StructureMap是否支持——无论如何,您可以手动执行。下面是一个示例