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