ASP.Net MVC5和StructureMap4 – 简化方法

在将StructureMap.MVC5集成到ASP.Net MVC5 Web应用程序时,意识到它使用3.1版本的SM而不是4+。 然后尝试获取此Nuget中包含的文件并将其更改为SM4,但是有很多代码存在,并且SM3.1和SM4之间存在多个不兼容的调用。

有了这个,我最终编写了一个简单的IoC,如下所示。 寻找有关其不足之处的建议以及与此处链接的Nuget版本相比效率低下的问题。

定义默认注册表

public class DefaultRegistry : Registry { public DefaultRegistry() { Scan( scan => { scan.Assembly("MyAssembly"); scan.WithDefaultConventions(); }); For<IContext>().Use(); } } 

创建一个静态容器

 public static class IoC { private static IContainer container = new Container(c => c.AddRegistry()); public static IContainer Container { get { return container; } } } 

覆盖控制器工厂

 public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return (IController)IoC.Container.GetInstance(controllerType); } } 

在Global.asax中注册

 protected void Application_Start() { ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); } 

这有效,但担心过度简化它可能会引入其他问题。 寻找这种方法的问题的见解。

有两件事。 你需要在DefaultRegistry中有一个更强大的控制器注册:

 scan.With(new ControllerConvention()); 

这是StructureMap 4的ControllerConvention:

 public class ControllerConvention : IRegistrationConvention { public void ScanTypes(TypeSet types, Registry registry) { foreach (var type in types.AllTypes().Where(type => type.CanBeCastTo() && !type.IsAbstract)) { registry.For(type).LifecycleIs(new UniquePerRequestLifecycle()); } } } 

其次,使用DependencyResolver比创建自己的DefaultControllerFactory更可取。 正如您在此处所看到的,MVC的实现更加丰富。 您可以将其复制到您自己的,但这不是未来certificate,最重要的是,不需要,因为您可以使用DependencyResolver ,保持您的代码更简单。 基本上,使用您从安装StructureMap.MVC5获得的StructuremapMvcStructureMapDependencyScope类。 如果您愿意,可以将初始化并从StructuremapMvc处理到Global.asax。

 public static StructureMapDependencyScope StructureMapDependencyScope { get; set; } public static void End() { StructureMapDependencyScope.Dispose(); } public static void Start() { IContainer container = IoC.Initialize(); StructureMapDependencyScope = new StructureMapDependencyScope(container); DependencyResolver.SetResolver(StructureMapDependencyScope); DynamicModuleUtility.RegisterModule(typeof(StructureMapScopeModule)); }