• 注册接口使用StructureMap和Autofac等Ioc容器


    时间紧张,先记一笔,后续优化与完善。

        1、StructureMap应用

        StructureMap是通过定义一个StructureMapControllerFactory替换默许的DefaultControllerFactory,在Application_Start行进接口的注册。体具的应用网上已经有很多程教,这里就不多做绍介了。在这里要讲的是应用StructureMap做ico器容时HandleError性属会不起作用,据网上说可以修改Global件文中的RegisterGlobalFilters方法,但是总觉得用上去非常不爽,有些mvc有的特性用不了了,可见StructureMap的侵入性是比大较的。同时StructureMap不持支Filter Attribute注入,只能通过态静工厂实当初Filter Attribute中应用接口,如写重AuthorizeAttribute授权性属:

    /// <summary>
    /// 写重授权机制
    /// </summary>
    public class UserAuthorizeAttribute : AuthorizeAttribute
    {
        private readonly ILocalAuthenticationService _authenticationService =
            AuthenticationFactory.GetLocalAuthenticationService();
    
        protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException("httpContext");
    
            var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie == null)
                return false;
            if (string.IsNullOrEmpty(cookie["username"]))
                return false;
            if (string.IsNullOrEmpty(cookie["usertoken"]))
                return false;
    
            if (!_authenticationService.ValidateAuthenticationToken(cookie["username"], cookie["usertoken"]))
                return false;
    
            return true;
        }
    }

        我们须要建一个工厂才可以在AuthorizeAttribute中应用接口。AuthenticationFactory如下

    public class AuthenticationFactory
    {
        private static ILocalAuthenticationService _authenticationService;
    
        public static void InitializeAuthenticationFactory(
            ILocalAuthenticationService authenticationService)
        {
            _authenticationService = authenticationService;
        }
    
        public static ILocalAuthenticationService GetLocalAuthenticationService()
        {
            return _authenticationService;
        }
    }

        同时还要在Application_Start对接口行进初始化。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        BootStrapper.ConfigureDependencies();
    
        AuthenticationFactory.InitializeAuthenticationFactory
                                (ObjectFactory.GetInstance<ILocalAuthenticationService>());
    
        ApplicationSettingsFactory.InitializeApplicationSettingsFactory
                                (ObjectFactory.GetInstance<IApplicationSettings>());
    
        LoggingFactory.InitializeLogFactory(ObjectFactory.GetInstance<ILogger>());
    
        EmailServiceFactory.InitializeEmailServiceFactory
                                (ObjectFactory.GetInstance<IEmailService>());
        ObjectFactory.GetInstance<ILogger>().Log("程序开始了");
    
        ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory());
    
        //移除过剩的视图引擎
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine());
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

        2、Autofac应用

        对相StructureMap说来,Autofac的浸入性要小得多。请考参文章http://www.cnblogs.com/shanyou/archive/2010/02/07/1665451.html。他不会像StructureMap会致导mvc特性失效。同时持支性属注入。

        每日一道理
    今天阳光很好,坐在窗前,看窗外如此晴朗的天感觉特别舒心,雨过天晴后的世界总给人一种明媚,仿佛阳光照耀在“心田”上空,让前些天被风雨践踏的花朵重新得到爱的关怀,重现生命的活力!
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        var builder = new ContainerBuilder();
        //注册控制器
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        //注册Filter Attribute
        builder.RegisterFilterProvider();
    
        //注册各种
        ContainerManager.SetupResolveRules(builder);
    
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    
        //初始化各种工厂
        AuthenticationFactory.InitializeAuthenticationFactory(container.Resolve<ILocalAuthenticationService>());
        ApplicationSettingsFactory.InitializeApplicationSettingsFactory(container.Resolve<IApplicationSettings>());
        EmailServiceFactory.InitializeEmailServiceFactory(container.Resolve<IEmailService>());
        LoggingFactory.InitializeLogFactory(container.Resolve<ILogger>());
    
        container.Resolve<ILogger>().Log("哇!程序开始了!");
    
        //移除过剩的视图引擎
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine());
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

        Filter Attribute注入

    /// <summary>
    /// 写重授权机制
    /// </summary>
    public class UserAuthorizeAttribute : AuthorizeAttribute
    {
        //private readonly ILocalAuthenticationService _authenticationService =
        //    AuthenticationFactory.GetLocalAuthenticationService();
        public ILocalAuthenticationService _authenticationService { get; set; }
    
        protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException("httpContext");
    
            var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie == null)
                return false;
            if (string.IsNullOrEmpty(cookie["username"]))
                return false;
            if (string.IsNullOrEmpty(cookie["usertoken"]))
                return false;
    
            if (!_authenticationService.ValidateAuthenticationToken(cookie["username"], cookie["usertoken"]))
                return false;
    
            return true;
        }
    }

        ContainerManager类中注册各种接口

    public class ContainerManager
    {
        public static void SetupResolveRules(ContainerBuilder builder)
        {
            builder.RegisterType<UserRepository>().As<IUserRepository>();
            builder.RegisterType<UserGroupRepository>().As<IUserGroupRepository>();
            builder.RegisterType<SqlServrUnitOfWork>().As<IUnitOfWork>();
    
            builder.RegisterType<UserService>().As<IUserService>();
            builder.RegisterType<UserGroupService>().As<IUserGroupService>();
            builder.RegisterType<EncryptionService>().As<IEncryptionService>();
            builder.RegisterType<JwayAuthenticationService>().As<ILocalAuthenticationService>();
            builder.RegisterType<SMTPService>().As<IEmailService>();
            builder.RegisterType<Log4NetAdapter>().As<ILogger>();
            builder.RegisterType<WebConfigApplicationSettings>().As<IApplicationSettings>();
        }
    }

        Autofac的其他注册式形请考参http://code.google.com/p/autofac/wiki/MvcIntegration3
    随着Repository模式的普遍应用,Ioc器容越来遭到大广开发者的爱好。

        

        

    文章结束给大家分享下程序员的一些笑话语录: 自行车
    一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
    骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
    另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。

  • 相关阅读:
    warning: already initialized constant FileUtils::VERSION
    manjaro开启sdd trim
    manjaro i3 sound soft
    archlinux or manjaro install pg gem
    rails 5.2 启动警告 warning: previous definition of VERSION was here和bootsnap
    react config test env with jest and create-react-app 1
    Python pyQt4/PyQt5 学习笔记4(事件和信号)
    MacOS 安装PyQt5
    笔者使用macOS的一些经验点滴记录1
    win7 64位系统下读写access数据库以及安装了office32位软件再安装64位odbc的方法
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3033632.html
Copyright © 2020-2023  润新知