简体   繁体   中英

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.


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.

There is an example of 1 module in this file:

// 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

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/

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.

In the mvc5 website tell structure map to scan for registries in your class lib assemblies next to the other configurations you have made.

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

 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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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