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获得的StructuremapMvc
和StructureMapDependencyScope
类。 如果您愿意,可以将初始化并从StructuremapMvc
处理到Global.asax。
上述就是C#学习教程:ASP.Net MVC5和StructureMap4 – 简化方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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)); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1019536.html