首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.Net MVC5和StructureMap4 -简化方法

ASP.Net MVC5和StructureMap4 -简化方法
EN

Stack Overflow用户
提问于 2016-03-07 07:00:33
回答 1查看 915关注 0票数 2

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

在此之后,我编写了一个简单的IoC,如下所示。寻找建议,它的不足,和什么低效率相比,Nuget版本链接在这里。

定义默认注册表

代码语言:javascript
复制
public class DefaultRegistry : Registry
{
    public DefaultRegistry() {
        Scan(
            scan => {
                scan.Assembly("MyAssembly");
                scan.WithDefaultConventions();
            });

        For<IContext<SomeClass>>().Use<MyContext>();
    }
}

创建静态容器

代码语言:javascript
复制
public static class IoC {
    private static IContainer container = new Container(c => c.AddRegistry<DefaultRegistry>());
    public static IContainer Container { get { return container; } }
}

重写控制器工厂

代码语言:javascript
复制
public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return (IController)IoC.Container.GetInstance(controllerType);
    }
}

寄存器在Global.asax

代码语言:javascript
复制
protected void Application_Start()
{
    ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}

这是可行的,但担心我过于简化它,这可能会带来其他问题。寻找与这种方法的问题的洞察力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 10:31:16

有两件事。您需要在DefaultRegistry中这样做,以便对控制器进行更健壮的注册:

代码语言:javascript
复制
scan.With(new ControllerConvention());

下面是ControllerConvention for StructureMap 4:

代码语言:javascript
复制
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,使您的代码更简单。基本上,使用安装StructuremapMvcStructureMapDependencyScope所获得的类StructureMap.MVC5。如果您愿意,可以将初始化和处理从StructuremapMvc移动到Global.asax。

代码语言:javascript
复制
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));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35837920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档