第三节: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?}");
            });
        }
    }
}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?}");
            });
        }
    }
}

应用服务层使用注入的对象:

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 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/xiaoxionglove/article/details/80867630