제 III : OA 권한 관리 시스템 (의존성 주입)

Nuget 설치 : Autofac

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using log4net;
using log4net.Config;
using log4net.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using OYW.OA.Application.Settings;
using OYW.OA.DTO;
using OYW.OA.DTO.Redis;
using OYW.OA.EFRepositories;
using OYW.OA.Infrastructure.Redis;
using OYW.OA.Web.Models;

namespace OYW.OA.Web
{
    public class Startup
    {
        public static ILoggerRepository loggerRepository { get; set; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            loggerRepository = LogManager.CreateRepository("OYW.OA.Web");
            XmlConfigurator.Configure(loggerRepository, new FileInfo("log4net.config"));

        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var builder = new ContainerBuilder();
            RegisterService(builder);
            builder.Populate(services);
            var serviceProvider = new AutofacServiceProvider(builder.Build());
            IocManager.ServiceProvider = serviceProvider;
            return serviceProvider;
        }
        private void RegisterService(ContainerBuilder builder)
        {
            builder.RegisterType(typeof(OAEntity)).AsSelf().InstancePerLifetimeScope();
            builder.RegisterType(typeof(UserMgr)).AsSelf().SingleInstance();
            builder.RegisterType(typeof(RedisHelper)).AsSelf().SingleInstance();
            var applicationServices = Assembly.Load("OYW.OA.Application");
            builder.RegisterAssemblyTypes(applicationServices)
           .Where(t => t.Name.EndsWith("Service"))
           .AsSelf().InstancePerLifetimeScope();
            builder.Register<OAUser>(u => GetCurrentUser()).InstancePerLifetimeScope();
            builder.Register<ILog>(u => GetLog()).InstancePerLifetimeScope();
        }

        private OAUser GetCurrentUser()
        {
            var accessor = IocManager.Resolve<IHttpContextAccessor>();
            string sessionid = "";
            accessor.HttpContext.Request.Cookies.TryGetValue("oa.sessionid", out sessionid);
            var redisHelper = IocManager.Resolve<RedisHelper>();
            var user = redisHelper.Get<OAUser>(sessionid);
            if (user == null) user = new OAUser { };
            return user;
        }

        private ILog GetLog()
        {
            var log = LogManager.GetLogger(loggerRepository.Name, typeof(Startup));
            return log;
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}Autofac을 사용함; 
Autofac.Extensions.DependencyInjection을 사용함; 
log4net을 사용함; 
log4net.Config을 사용함; 
log4net.Repository을 사용함; 
Microsoft.AspNetCore.Builder을 사용함; 
Microsoft.AspNetCore.Hosting을 사용함; 
Microsoft.AspNetCore.Http을 사용함; 
Microsoft.AspNetCore.Mvc을 사용함; 
Microsoft.EntityFrameworkCore을 사용함; 
Microsoft.Extensions.Configuration을 사용함; 
Microsoft.Extensions.DependencyInjection을 사용함; 
Microsoft.Extensions.DependencyInjection.Extensions을 사용함; 
Microsoft.Extensions.Logging을 사용함; 
OYW.OA.Application.Settings을 사용함; 
OYW.OA.DTO을 사용함; 
OYW.OA.DTO.Redis을 사용함; 
OYW.OA.EFRepositories을 사용함;
OYW.OA.Infrastructure.Redis을 사용함; 
OYW.OA.Web.Models을 사용함; 

네임 스페이스 OYW.OA.Web 
{ 
    공용 클래스 시작 
    { 
        공공 정적 ILoggerRepository loggerRepository {얻으십시오; 세트; } 

        공개 시작 (IConfiguration 구성) 
        { 
            구성 = 구성; 
            loggerRepository = LogManager.CreateRepository ( "OYW.OA.Web"); 
            XmlConfigurator.Configure (loggerRepository, 새로운에서는 FileInfo ( "log4net.config")); 

        } 

        공공 IConfiguration 구성 {얻으십시오; } 

        //이 메소드는 런타임에 의해 호출됩니다. 컨테이너에 서비스를 추가하려면이 방법을 사용합니다. 
        공공IServiceProvider
            builder.RegisterType (대해서 typeof (UserMgr)) AsSelf () SingleInstance ()..;ConfigureServices (IServiceCollection 서비스) 
        { 
            var에 빌더 = 새 ContainerBuilder (); 
            RegisterService (빌더); 
            builder.Populate (서비스); 
            VAR serviceProvider 새로운 AutofacServiceProvider을 = (builder.Build ()); 
            IocManager.ServiceProvider = serviceProvider; 
            serviceProvider를 반환; 
        } 
        개인 무효 RegisterService (ContainerBuilder 빌더) 
        { builder.RegisterType (대해서 typeof (OAEntity)) AsSelf () InstancePerLifetimeScope ()..; 
            builder.RegisterType (대해서 typeof (RedisHelper)) AsSelf () SingleInstance ()..; 
            VAR applicationServices = Assembly.Load ( "OYW.OA.Application");
           
            builder.RegisterAssemblyTypes (applicationServices) 
           어디에요 (t => t.Name.EndsWith ( "서비스")) 
           .AsSelf () InstancePerLifetimeScope ().; 
            builder.Register <OAUser> (U => GetCurrentUser ()) InstancePerLifetimeScope ().; 
            . builder.Register <ILOG> (U =>의 getLog ()) InstancePerLifetimeScope (); 
        } 

        개인 OAUser GetCurrentUser () 
        { 
            VAR 접근 = IocManager.Resolve <IHttpContextAccessor> (); 
            스트링 세션 id = ""; 
            accessor.HttpContext.Request.Cookies.TryGetValue (세션 id 밖으로 "oa.sessionid");
            VAR redisHelper = IocManager.Resolve <RedisHelper> (); 
            VAR 사용자 redisHelper.Get = <OAUser> (세션 id);
            사용자를 반환; 
        } 

        개인 ILOG의 getLog () 
        { 
            VAR 로그 = LogManager.GetLogger (loggerRepository.Name의 typeof (시작)); 
            로그를 반환; 
        } 

        //이 메소드는 런타임에 의해 호출됩니다. HTTP 요청 파이프 라인을 구성하려면이 방법을 사용합니다. 
        공공 무효 구성 (IApplicationBuilder 응용 프로그램, IHostingEnvironment ENV) 
        { 
            app.UseMvc (경로 => 
            { 
                routes.MapRoute ( 
                    이름 : "기본", 
                    템플릿 : "{컨트롤러 = 홈} / {행동 = 인덱스} / {ID}?") ;
            }); 
        } 
    } 
}

객체를 이용하여 응용 서비스 주입 층 :

using OYW.OA.DTO;
using OYW.OA.DTO.Settings;
using OYW.OA.EFRepositories;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Dynamic.Core;
using log4net;
using OYW.OA.Infrastructure.User;

namespace OYW.OA.Application.Settings
{
    public class MenuService
    {
        private readonly OAEntity db;
        private readonly OAUser user;
        public MenuService(OAEntity db, OAUser user, ILog log)
        {
            this.db = db;
            this.user = user;
        }

        /// <summary>
        /// 菜单
        /// </summary>
        /// <returns></returns>
        /// 
        public List<SYS_MenuDTO> GetMenus()
        {

            var cur_user_id = user.EmplID;
            var menus = db.SYS_Menu.ToList();
            //非管理员
            if (user.EmplID != AdminUser.EmplID)
            {
                var needRemoveLst = new List<Guid>();
                menus.ForEach(x =>
                {
                    string[] permissionCodes = new string[] { x.MenuName + "-Use", x.MenuName + "-Admin" };
                    bool need = true;
                    foreach (var code in permissionCodes)
                    {
                        if (VerifyPermission(code, cur_user_id))
                        {
                            need = false;
                            break;
                        }
                    }
                    if (need)
                    {
                        needRemoveLst.Add(x.ID);
                    }
                });
                menus.RemoveAll(p => needRemoveLst.Contains(p.ID));
            }

            return menus.Where(p => p.ParentID == null).Select(p => new SYS_MenuDTO
            {
                MenuName = p.MenuName,
                Code = p.Code,
                Icon = p.Icon,
                URL = p.URL,
                Sort = p.Sort,
                SubMenus = menus.Where(x => x.ParentID == p.ID).Select(x => new SYS_MenuDTO
                {
                    MenuName = x.MenuName,
                    Code = x.Code,
                    Icon = x.Icon,
                    URL = x.URL,
                    Sort = x.Sort,
                }).OrderBy(x => x.Sort).ToList()
            }).OrderBy(p => p.Sort).ToList();
        }

        private bool VerifyPermission(string code, string emplid)
        {
            return false;
        }
    }
}

 

 

 

 

게시 된 128 개 원래 기사 · 원 찬양 18 ·은 50000 +를 볼

추천

출처blog.csdn.net/xiaoxionglove/article/details/80867630