我有一个具有以下结构的 3 层解决方案:
UI -> BLL <- DAL
UI 是一个 ASP.NET MVC 应用程序。每个控制器的构造函数都需要 BLL 组件。每个 BLL 组件在其构造函数上都需要 DAL 组件。
过去我使用 StructureMap 作为 IoC 容器。在其早期版本中,StructureMap 使用ObjectFactory
静态类。因为它是一个静态类,所以我可以在 MVC 上使用 StructureMap 来替换默认值ControllerFactory
,然后是另一个进行 BLL 和 DAL 配置的项目。
在较新的 StructureMap 版本中,ObjectFactory 已被标记为过时。我明白现在我必须提供我自己的 Container 实例。
但是,如果没有连接我的项目,我就不会发生这种链条。此外,如果我将 BLL 和 DAL 的配置添加到 MVC 项目,我将不得不在 UI 级别引用我想避免的所有内容。
我认为我必须做的是使用 StructureMap 保留两个不同的项目。
MVC 项目内部的一个,负责创建控制器。但是,我需要找到一种将 BLL 实例委托给第二个容器的方法,该容器可能会保持原样并知道如何创建 BLL 和 DAL(因此可以创建 BLL)。
第二个(创建 BLL 组件)如下所示:
public static class BLLContainer
{
public static Container BuildServiceContainer()
{
return new Container(x =>
{
// This uses the Scan method to locate BLL and DAL
// interfaces and implementations.
x.AddRegistry(new DALRegistry());
});
}
}
我的问题是:
是否真的可以在 BLL 级别将对象创建从我的 MVC 应用程序委托给 StructureMap 容器,而无需引用其他(不需要的)项目?
如果我要返回容器的新实例,如上面的代码所示,这意味着我正在为对 Web 服务器的每个请求运行扫描程序(StructureMap 使用 PerRequest 作为默认值)。我怎样才能避免这种情况?除了回到单身人士之外,我不知道如何防止这种情况发生。