我的解决方案中有4个项目
所有代码优先数据库设置和结构图设置都位于基础结构项目中。 UI是ASP.NET MVC5。基础结构项目还承载一些WebService实现。
在UI项目中有一些类充当控制器和外部Web服务之间的层。例如:
UI.Services.MappingService.cs
将使用Infrastructure.ExternalWebServices.MappingWebService.cs
到目前为止,没有任何问题,接口名称都与具体的类名相匹配,因此structuremap可以正确解析它们。但是,现在需要从一个服务接口进行更改并实现多个具体类。
基础结构项目无法引用UI,因为它会创建循环依赖项。使用Mapping示例,我需要
UI.Services.Interfaces.IMappingService
具有不同的混凝土,structuremap将通过注册表文件中的逻辑或工厂类来解析正确的混凝土。问题是注册表文件位于基础结构项目中,该项目不知道UI,因此无法For(...).Use(...)
。
如果我将接口移动到实体项目,它可以看到它们,但这也会涉及移动具体的类,这将破坏许多引用并需要很多移动文件来修复。 UI中的整个服务层加上相当多的视图模型需要移出实体项目才能实现。
有更简单的方法吗?我不是DI / StructureMap专家,所以我想确保我不仅仅是让生活变得更加艰难。
答案 0 :(得分:10)
您可以使用结构图的注册表功能
首先,您需要在每个项目中创建注册表,如下所示。
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,它将在每个项目中寻找注册表。在这里,我只推出了装配名称。您需要更换组件。
因此,您可以访问每个项目的内容,它将汇总所有内容。