在整合的同时结构图.MVC5 https://www.nuget.org/packages/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 的控制器约定:
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的实现更加丰富如你所见here https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultControllerFactory.cs。您可以将其复制到您自己的中,但这不是面向未来的证明,最重要的是,不需要,因为您可以使用DependencyResolver
,让你的代码更简单。基本上,使用类StructuremapMvc
and StructureMapDependencyScope
您可以通过安装 StructureMap.MVC5 获得。您可以将初始化和处置从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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)