我的解决方案中有 4 个项目
- 界面
- 基础设施
- 实体
- 测试
所有代码优先数据库设置和结构图设置都位于基础设施项目中。用户界面是 ASP.NET MVC5。基础设施项目还承载了一些 WebService 实现。
在 UI 项目中有一些类充当 Controller 和外部 Web 服务之间的层。例如:
UI.Services.MappingService.cs
将使用 Infrastructure.ExternalWebServices.MappingWebService.cs
到目前为止没有问题,接口(interface)名称都与具体的类名称匹配,因此structuremap正确解析了它们。但是,现在需要从其中一个服务接口(interface)进行更改并实现多个具体类。
基础设施项目无法引用 UI,因为它会创建循环依赖项。使用映射示例,我需要
UI.Services.Interfaces.IMappingService
要有不同的具体内容,结构图将通过注册表文件或工厂类中的逻辑解析正确的具体内容。问题是注册表文件位于不了解 UI 的基础设施项目中,因此 For(...).Use(...)
是不可能的。
如果我将接口(interface)移出到实体项目中,它就可以看到它们,但这也涉及将具体类移出,这会破坏许多引用并需要大量移动文件来修复。 UI 中的整个服务层加上相当多的 View 模型需要移出到 Entities 项目才能实现。
有没有更简单的方法?我不是 DI/StructureMap 专家,所以我想确保我不仅仅是让生活更艰难。
最佳答案
您可以使用结构图的注册表功能
首先您需要在每个项目中创建注册表,如下所示。
public class InfrastructureRegistry : Registry
{
public InfrastructureRegistry ()
{
Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
//any spefic implementation
}
}
然后你需要像下面这样创建你的容器。
return new Container(
x => x.Scan
(
scan =>
{
scan.Assembly("YourProject.UI");
scan.Assembly("YourProject.Infrastructure");
scan.Assembly("Your.Entities");
scan.WithDefaultConventions();
scan.LookForRegistries();
}
)
);
我在这里放置了 scan.lookforregistries,它将在每个项目中查找注册表。在这里我只输入了程序集的名称。您需要替换为您的程序集。
因此您可以为每个项目访问它,它会连接所有的东西。
关于c# - StructureMap 解决跨项目的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29470251/