首先,让我们开始描述一下我的项目架构。
我有一个名为Portal.Web的asp.net mvc应用程序作为启动项目,还有多个名为Plugin.XXX (Plugin.News、Plugin.Cms等)的asp.net mvc应用程序,Portal.Web引用了所有这些插件。
我为每个Plugins安装了StrcutureMap.Mvc5
正如您所知道的,当您安装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我可以在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>();
});
}
}
}发布于 2014-12-11 21:40:17
如果我正确理解了您的问题,您是否可以创建一个DependencyResolution类库,其中包含StructureMap.Mvc5包,然后在您的插件中使用(这将节省包含StructureMap.Mvc5版本的每个插件),并拥有对您的DependencyResolution类库的单一引用。
从这里开始,您的单个插件可以包含它们自己的StructureMap注册表,更多的全局注册表保存在DependencyResolution类库中。
https://stackoverflow.com/questions/27422962
复制相似问题