【发布时间】:2015-03-07 22:26:18
【问题描述】:
在我的 MVC 应用程序中,我定义了两个接口:IQueryMappingsConfigurator 和 ICommandMappingsConfigurator。这两个接口用于为查询和命令上下文提供EntityFramework 映射。
在同一个解决方案中,我有两个服务:IMembershipService 和 IMessagingService;对于这些服务中的每一个,都有一个 Registry 指定 ICommandMappingsConfigurator 和 IQueryMappingsConfigurator 的实现:
// In Services.Membership project
public class MembershipRegistry : Registry
{
public MembershipRegistry()
{
For<ICommandMappingsConfigurator>()
.Use<MembershipCommandMappingsConfigurator>();
For<IQueryMappingsConfigurator>()
.Use<MembershipQueryMappingsConfigurator>();
For<IMembershipService>()
.Use<MembershipService>();
}
}
// In Services.Messaging project
public class MessagingRegistry : Registry
{
public MessagingRegistry()
{
For<ICommandMappingsConfigurator>()
.Use<MessagingCommandMappingsConfigurator>();
For<IQueryMappingsConfigurator>()
.Use<MessagingQueryMappingsConfigurator>();
For<IMessagingService>()
.Use<MessagingService>();
}
}
每个服务都依赖于IQueryMappingsConfigurator 和ICommandMappingsConfigurator。
IMembershipService 和 IMessagingService 被 MVC 项目中的控制器使用:
public class MessageController : Controller
{
public MessageController(IMessagingService service){ }
}
public class MembershipController : Controller
{
public MembershipController(IMembershipService service){}
}
如何配置 StructureMap 容器,以便在需要 IMessagingService 的依赖项时,它将加载 ICommandMappingsConfigurator 和 IQueryMappingsConfigurator 的正确实现?
我尝试过使用这样的自定义注册约定:
public class ServiceRegistrationConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (IsApplicationService(type))
{
registry.Scan(_ =>
{
_.AssemblyContainingType(type);
_.LookForRegistries();
});
}
}
}
但是,当我尝试从 MessageController 访问操作方法时,我得到了错误
没有为 IMessagingService 指定配置
当我调试应用程序时,我可以看到Process 方法被IMessagingService 类型命中。
【问题讨论】:
-
IMessageService真的没有 DI 配置(这可以解释你的错误),还是你不小心把它排除在问题之外?如果不是,则很难准确判断问题出在哪里,因为您只发布了部分配置,其中一些界面似乎不相关。 -
@NightOwl888,
IMessagingService的 DI 配置在注册表中指定。请查看编辑。
标签: c# asp.net-mvc dependency-injection structuremap