StructureMap 解决跨项目的依赖关系
StructureMap resolve a dependency across projects
我的解决方案中有 4 个项目
- UI
- 基础设施
- 实体
- 测试
所有代码优先数据库设置和结构图设置都在基础设施项目中。 UI 是 ASP.NET MVC5。基础设施项目还承载了一些 WebService 实现。
在 UI 项目中有一些 classes 作为控制器和外部 Web 服务之间的层。例如:
UI.Services.MappingService.cs
将使用 Infrastructure.ExternalWebServices.MappingWebService.cs
中的方法
到目前为止没有问题,接口名称都与具体的 class 名称匹配,因此 structuremap 正确解析了它们。但是,现在需要进行更改并从其中一个服务接口实施多个具体 classes。
基础结构项目无法引用 UI,因为它创建了循环依赖项。使用映射示例,我需要
UI.Services.Interfaces.IMappingService
要有不同的具体内容,结构图将通过注册表文件或工厂中的逻辑解析正确的内容 class。问题是注册表文件在基础设施项目中,它不知道 UI 所以 For(...).Use(...)
是不可能的。
如果我将接口移到实体项目中,它就可以看到它们,但这也涉及将具体的 classes 移出,这会破坏许多引用并需要大量移动要修复的文件。 UI 中的整个服务层加上相当多的视图模型需要移出到 Entities 项目才能实现。
有没有更简单的方法?我不是 DI/StructureMap 专家,所以我想确定我不只是让生活更艰难。
您可以使用 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,它将在每个项目中查找注册表。在这里我只输入了程序集的名称。您需要替换为您的程序集。
因此您可以为每个项目访问它,它会连接所有的东西。
我的解决方案中有 4 个项目
- UI
- 基础设施
- 实体
- 测试
所有代码优先数据库设置和结构图设置都在基础设施项目中。 UI 是 ASP.NET MVC5。基础设施项目还承载了一些 WebService 实现。
在 UI 项目中有一些 classes 作为控制器和外部 Web 服务之间的层。例如:
UI.Services.MappingService.cs
将使用 Infrastructure.ExternalWebServices.MappingWebService.cs
到目前为止没有问题,接口名称都与具体的 class 名称匹配,因此 structuremap 正确解析了它们。但是,现在需要进行更改并从其中一个服务接口实施多个具体 classes。
基础结构项目无法引用 UI,因为它创建了循环依赖项。使用映射示例,我需要
UI.Services.Interfaces.IMappingService
要有不同的具体内容,结构图将通过注册表文件或工厂中的逻辑解析正确的内容 class。问题是注册表文件在基础设施项目中,它不知道 UI 所以 For(...).Use(...)
是不可能的。
如果我将接口移到实体项目中,它就可以看到它们,但这也涉及将具体的 classes 移出,这会破坏许多引用并需要大量移动要修复的文件。 UI 中的整个服务层加上相当多的视图模型需要移出到 Entities 项目才能实现。
有没有更简单的方法?我不是 DI/StructureMap 专家,所以我想确定我不只是让生活更艰难。
您可以使用 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,它将在每个项目中查找注册表。在这里我只输入了程序集的名称。您需要替换为您的程序集。
因此您可以为每个项目访问它,它会连接所有的东西。