ASP.Net MVC5 和 StructureMap4 - 简化方法
ASP.Net MVC5 and StructureMap4 - Simplified Approach
在将 StructureMap.MVC5 集成到 ASP.Net MVC5 网络应用程序时,意识到它使用 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
。如您所见 here,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));
}
在将 StructureMap.MVC5 集成到 ASP.Net MVC5 网络应用程序时,意识到它使用 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
。如您所见 here,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));
}