간단한 인젝터에 수동으로 등록하는 컨트롤러
-
20-12-2019 - |
문제
나는 시도를 구현하는 종속성으로 주입 아키텍처(MVC,DDD 도메인 모델,Repository).내공이 포함됩 ASP.NET Id2.0.
이 단계에서,나는 원하지 않는 디 제어의 정체성 2.0 체(UserAdminController,RolesAdminController...).아보 보안체의 외부에 있습니다.이 단계에서는,통합 Id 체에서 디 매우 어렵습니다.나는 좋은 모습을 보 이미 누군가가 수행,그래서 제가 읽을 수 있는 방법을 배웁니다.나는 아무것도 찾을 수 없습니다.(을 발견 중 하나는 게시물을 가까이 왔는데,해상도).
어쨌든,저는 간단 인젝터 MVC 구현하십시오(표준 코드는 아래),그리고 많은 것을 내가 믿는 문제는 나에게 전화 RegisterMvcControllers.
올바른 경우,그러나 이 문 픽업 모든 컨트롤러로 자신의 이름을후로 고정"컨트롤러".
질문:어떻게 선택할 수 있습니는 컨트롤러 등록 간단한 Injector?(이라는 수동으로 등록?)
어떤 도움이 될 것이 크게 감사하고,내가 지출의 대부분은 오늘 우리는 어리석음을 주는 모든이며,다음 단계로 진행하,즉는 디 구현하고,인스턴스화 내 개체입니다.
...
...
...에서 호출 Application_Start()
// Create a Simple Injector container
var container = new Container();
// Configure the container
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
// Verify the container's configuration
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
private static void InitializeContainer(Container container)
{
container.Register<MyService1>();
container.Register<IMyRepositoryA, MyRepositoryA>();
// Trying to include Identity into Simple Injector - please ignore
container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
}
해결책
이 RegisterMvcControllers
등록 다음과 같은 유형:
- 유해 공개
- 유형을 구현해야 합니다
System.Web.Mvc.IController
- 유형 abstract
- 유형되지 않아야 합니다 일반적인 유형의 정의
- 그것의 이름으로 끝나야 합니다"컨트롤러"
당신이 볼 수 있는 무슨 일 여기에는 원시 코드.
이 RegisterMvcControllers
연장방법으로 통화 SimpleInjectorMvcExtensions.GetControllerTypesToRegister
방법 목록을 얻을 수있는 컨트롤러를 등록합니다.호출할 수 있는 방법을 자신이 볼 수있는 무엇이 등록 다음과 같다:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
그래서 대신 전화 RegisterMvcControllers
당신이 등록할 수 있는 컨트롤러 자신을 호출하여 GetControllerTypesToRegister
방법:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly());
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
이 방법으로 필터링할 수 있습니다 모든 컨트롤러를 등록하려는 수동:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
.Where(type => type.Name != "UserStore`1");
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
또 다른 옵션은 무시 등록을 사용하고 있습니다:
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Options.AllowOverridingRegistrations = true;
container.Register<IUserStore<ApplicationUser>>(
() => new UserStore<ApplicationUser>(new ApplicationDbContext()))
// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;