首先让我们开始描述我的项目架构
我有一个名为Portal.Web
的asp.net mvc应用程序作为启动项目和多个asp.net mvc应用程序,它们调用Plugin.XXX
(Plugin.News,Plugin.Cms等)和Portal.Web
有引用来自所有这些插件。
我为这些StrcutureMap.Mvc5
中的每一个安装了Plugins
如您所知,当您安装StructureMap
创建的名为DependencyResolution
的文件夹并且其中包含一些文件时,其中一个文件是IoC.cs
,您可以在其中初始化容器。
现在我的问题是因为所有插件都有自己的IoC.cs
,看起来它们会覆盖彼此的容器,所以最后我得到了这个错误:
No parameterless constructor defined for this object
// inner exception
No default Instance is registered and cannot be automatically determined for type 'Portal.Plugins.Page.Interfaces.IPage'
There is no configuration specified for Portal.Plugins.Page.Interfaces.IPage
1.) new RouteController(*Default of IUnitOfWork*, *Default of IPage*)
2.) Portal.Web.Controllers.RouteController
3.) Instance of Portal.Web.Controllers.RouteController
4.) Container.GetInstance(Portal.Web.Controllers.RouteController)
There is no configuration specified for Portal.Plugins.Page.Interfaces.IPage
我可以在IoC.cs
项目中使用一个Portal.Web
,但我需要保持模块化并尽可能地使插件独立。
有没有办法让插件容器保持独立?
namespace Portal.Plugins.Account.DependencyResolution {
using StructureMap;
public static class IoC {
public static IContainer Initialize() {
return new Container(c =>
{
c.AddRegistry<DefaultRegistry>();
c.For<IUnitOfWork>().LifecycleIs(new HttpContextLifecycle()).Use<AccountDbContext>();
c.For<IAccount>().Use<AccountService>();
});
}
}
}
namespace Portal.Plugins.Cms.DependencyResolution {
using StructureMap;
public static class IoC {
public static IContainer Initialize() {
return new Container(c =>
{
c.AddRegistry<DefaultRegistry>();
c.For<IUnitOfWork>().LifecycleIs(new HttpContextLifecycle()).Use<CmsDbContext>();
c.For<IPage>().Use<PageService>();
c.For<IMenu>().Use<MenuService>();
c.For<IMedia>().Use<MediaService>();
});
}
}
}
答案 0 :(得分:0)
如果我正确理解您的问题,您无法创建一个DependencyResolution
类库,其中包含随后在整个插件中使用的StructureMap.Mvc5
包(这可以节省您的每一个包含StructureMap.Mvc5
}版本的插件,并且只对您的DependencyResolution
类库有一个引用。
从这里,您的各个插件可以包含自己的StructureMap注册表,更多的全局注册表保存在DependencyResolution
类库中。