在多个ASP MVC项目中使用StructureMap 3

时间:2014-12-11 12:31:15

标签: asp.net asp.net-mvc dependency-injection asp.net-mvc-5 structuremap

首先让我们开始描述我的项目架构 我有一个名为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>();
            });
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您无法创建一个DependencyResolution类库,其中包含随后在整个插件中使用的StructureMap.Mvc5包(这可以节省您的每一个包含StructureMap.Mvc5}版本的插件,并且只对您的DependencyResolution类库有一个引用。

从这里,您的各个插件可以包含自己的StructureMap注册表,更多的全局注册表保存在DependencyResolution类库中。