ASP.Net MVC5和StructureMap4 - 简化方法

时间:2016-03-07 07:00:33

标签: c# asp.net-mvc dependency-injection inversion-of-control structuremap4

StructureMap.MVC5集成到ASP.Net MVC5 Web应用程序时,意识到它使用3.1版本的SM而不是4+。然后尝试获取此Nuget中包含的文件并将其更改为SM4,但是有很多代码存在,并且SM3.1和SM4之间存在多个不兼容的调用。

有了这个,我最终编写了一个简单的IoC,如下所示。寻找有关其不足之处的建议以及与此处链接的Nuget版本相比效率低下的效率。

定义默认注册表

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);
    }
}

覆盖控制器工厂

protected void Application_Start()
{
    ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}

在Global.asax中注册

LocationListener

这有效,但担心过度简化它可能会引入其他问题。寻找这种方法的问题见解。

1 个答案:

答案 0 :(得分:2)

有两件事。您需要在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的实现更丰富,你可以看到here。您可以将其复制到您自己的,但这不是未来证明,最重要的是,不需要,因为您可以使用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));
}