簡體   English   中英

結構 map 初始化和多個 Visual Studio 項目

[英]Structure map Initialization and multiple Visual Studio projects

我在我的 VS 2019 解決方案中使用 Structure Map(版本 4.7),其中我有 8 個項目(如(子模塊)和 1 個主要 ASP.NET MVC5 項目)。


所有項目都是用 C# 編寫的,我在這個 MVC 項目中擁有主 StructureMap 文件 DefaultRegistry,它調用每個項目的 Facades 並在 web 演示文稿中使用它們。

此文件中有 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 行,其他接口自動找到並加載,但現在我必須將每個依賴項寫入結構 map 定義文件,如下所示

有沒有關於如何做得更好、更簡單、更短、更漂亮的解決方案?

謝謝

您可以使用 StructureMap 的注冊表功能: https://structuremap.github.io/registration/registry-dsl/

因此,每個 class 庫都有一個結構 map 注冊表,每個 class 庫的此注冊表配置您的依賴項,您應該只使用每個默認依賴項約定,因此您不必配置每個和

在 mvc5 網站中,告訴結構 map 掃描您的 class 庫程序集中的注冊表,並在您所做的其他配置旁邊。

這就是你真正需要做的。

是的,您可以通過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顧名思義是合同的命名空間(接口)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM