繁体   English   中英

ASP.Net MVC5 和 StructureMap4 - 简化方法

[英]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 中获得的StructuremapMvcStructureMapDependencyScope类。 如果您愿意,您可以将初始化和处理从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM