在将StructureMap.MVC5集成到ASP.Net MVC5 Web应用程序时,意识到它使用的是SM的3.1版本而不是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));
}
关于c# - ASP.Net MVC5和StructureMap4-简化方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35837920/