[英]ASP.Net MVC5 and StructureMap4 - Simplified Approach
在将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<SomeClass>>().Use<MyContext>();
}
}
创建静态容器
public static class IoC {
private static IContainer container = new Container(c => c.AddRegistry<DefaultRegistry>());
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<Controller>() && !type.IsAbstract))
{
registry.For(type).LifecycleIs(new UniquePerRequestLifecycle());
}
}
}
其次,使用DependencyResolver
比创建自己的DefaultControllerFactory
更可取。 正如您在此处看到的,MVC 的实现更加丰富。 你可以将它复制到你自己的,但这不是未来的证明,最重要的是,不需要,因为你可以只使用DependencyResolver
,让你的代码更简单。 基本上,使用从安装 StructureMap.MVC5 中获得的StructuremapMvc
和StructureMapDependencyScope
类。 如果您愿意,您可以将初始化和处理从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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.