2014-05-13 2 views
4

최근에 릴리스 된 ASP.NET ID 2.0.0을 3 계층 MVC 응용 프로그램에 통합하려고합니다. 나는 올바른 방향으로 가고 있는지 확신하지 못한다. 나는 두 가지 접근법을 볼 수 있습니다.MVC5 아키텍처 조언의 ID 2.0.0

첫 번째 방법에서는 각 논리 계층에 ID를 통합하는 방법을 사용했습니다. 기술적 인 문제가 있지만 아직 개발 중입니다.

두 번째 방법은 보안을 위해 전용 캡슐화 된 어셈블리로 이동하십시오.

나는 현재 접근 방식 1로 갔지만 모두 의문입니다. 또한, 다른 접근법을 취할?


접근 한

Web 
Startup.cs 
/App_Start/Startup.Auth 
/Controllers/Account 
/Controllers/Manage 
/Controllers/RolesAdmin 
/Controllers/UserAdmin 
/ViewModels 
/Views 

Business Logic 
/Service/AccountService 
/Service/ApplicationRoleManager 
/Service/ApplicationUserManager 
/Service/EmailService 
/Service/SmsService 
/Service/SignInHelper 

Data 
ApplicationDbContext 
ApplicationUser 

그래서, 나는 단순히 정체성을 가지고 각 내가 볼 계층이 맞는로를 연결했습니다. 웹에 속해 있지 않고 데이터 레이어에 속하는 '실제'데이터베이스 코드가 없기 때문에 대부분의 로그를 비즈니스 로직 레이어에 넣었습니다.

사이드 문제는 다음 Busness 논리 객체가 데이터 층에서

app.CreatePerOwinContext(ApplicationDbContext.Create); 

전화 나 웹/App_Start/Startup.Auth에, 나는 인스턴스화해야한다는 조금 불편 해요. 나는 이것에 대해 아직 생각하지 못했습니다. 이것은 또 다른 문제입니다 (그러나 내가 선택한 아키텍처와 관련이 있습니다).


에는 레이어가없는 순수한 보안 용 어셈블리를 만들기 접근법 2

단순히이 하나의 어셈블리로 식별 2.0.0 플러그 즉. 그리고 내 응용 프로그램에서이를 참조 할 수 있습니다. 그것은 레이어에 대항한다. 그러나 보안을 캡슐화합니다. 보안 개체가 응용 프로그램 수명 기간 동안 상주 할 수 있거나 제공되어야한다는 점을 감안할 때 이는 전혀 좋지 않은 것처럼 보입니다. 그래도 확장성에 대해서는 생각해 보지 않았습니다.

답변

2

나는 접근법 1을 택했고, 컨텍스트를 생성 할 때 HttpContext.Current [ "DbActiveContext"]에서 컨텍스트를 얻으려고 시도하는 도우미 클래스가 있으며 존재하지 않으면 그것을 사용한다. 전체 응용 프로그램에 대해 단일 컨텍스트를 사용합니다. 그래서 당신은 aspnet idenity에 대한 하나의 컨텍스트와 나머지 애플리케이션에 대한 하나의 컨텍스트로 끝나지 않습니다. 첫 번째 접근 방식에서 저장소 패턴을 사용하려고하는 것처럼 보입니다. 그렇다면 ID에 대한 모델이 DB 계층에 있어야하며 전체 저장소 패턴의 경우에는 저장소 모델을 만들 때 종속성 주입을 사용해야합니다. 개체를 만들면 런타임에 개체를 만들 때까지 종속성이 없습니다.

public class UserService 
{ 
    private readonly IRepository<ApplicationUser> _user; 
    private readonly UserManager<ApplicationUser> _userManager; 

    public UserService(IRepository<ApplicationUser> user, 
     UserManager<ApplicationUser> userManager) 
    { 
     _user = user; 
     _userManager = userManager; 

    } 

    public UserService() 
     : this(
      new Repository<ApplicationUser>(new ConnectionHelper()), 
      new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ConnectionHelper().Context))) 
    { 

    } 

나는이 희망 : 같은 UserService 서명으로

public UserController() 
     : this(
      new ApplicationUserManager(new UserStore<ApplicationUser>(new ConnectionHelper().Context)), 
      new UserService()) 
    { 

    } 

: 또한 당신이 뭔가를 할 수있는 DI와 서비스 계층에 usermanager를 사용하려면

namespace Data.Common 
{ 
    public class ConnectionHelper : IConnectionHelper 
    { 
     private ApplicationDbContext _context; 

     public ApplicationDbContext Context 
     { 
      get 
      { 
       if (_context == null && HttpContext.Current.Items["DbActiveContext"] != null) 
       { 
        _context = (ApplicationDbContext)HttpContext.Current.Items["DbActiveContext"]; 
       } 
       else if (_context == null && HttpContext.Current.Items["DbActiveContext"] == null) 
       { 
        _context = new ApplicationDbContext(); 
        HttpContext.Current.Items.Add("DbActiveContext", _context); 
       } 
       return _context; 
      } 
      set { _context = value; } 
     } 
    } 
} 

도와 줘!

+0

안녕 켈소, 이것은 훌륭한 대답입니다.그러나 MVC와 아이덴티티 2.0을 배우는 나 같은 사람에게는 (여전히 내 머리를 쥐고있다.), 더 많은 질문이 제기된다. 그런 코드를 가진 샘플 공개 프로젝트가 있습니까? 그렇게하면 도움이 될 것입니다. –

+0

아이덴티티 2.0 학습에 도움이되는 프로젝트가 없지만, 궁금한 점이 있으면 기꺼이 도와 드리겠습니다. –

+0

계속 게시 할 예정입니다. :) 현재 엔터프라이즈 디자인 패턴을 검토 중이며 곧 Identity 2.0을 계층에 구현하려고 시도합니다 (즉 접근 1). 위의 답변은 많은 도움이되었습니다. –