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