[英]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.