내 ASP.NET MVC 응용 프로그램과 주입 서비스 런타임 데이터를 전달하면 컨트롤러에 서비스를 주입하는 의존성 삽입 (Dependency Injection)를 사용합니다.은 의존성 주입
나는 내가 아는 한이 DI를 사용하여 생성자에 런타임 데이터를 전송하는 안티 패턴이 있기 때문에, 서비스에 런타임 데이터를 전달하는 몇 가지 방법을 찾을 필요가있다. 내 경우
나는 모든 서비스 사이에 다시 사용할 수있는 액세스 토큰에 의존 네 가지 서비스가 있습니다. 그러나 액세스 토큰이 만료 될 수 있으므로 만료 될 때 새로운 액세스 토큰을 발행해야합니다.하는 서비스 (독립 NuGet 패키지) 만든 모든 요청에 대한 액세스 토큰을 요구하는 다양한 서비스에 대한 모든 클라이언트입니다. 한 가지 예가 IUserServiceBusiness의 AddUserAsync 메소드입니다.이 메소드는 기본적으로 JSON 데이터로 끝점에 POST하고 권한 부여 헤더에 무기명 액세스 토큰을 추가합니다.
현재의 솔루션은 서비스의 모든 메소드에서 액세스 토큰을 매개 변수로 받아들이는 것입니다. 즉, 웹 애플리케이션이 액세스 토큰을 처리하고 필요할 때 전달하는 것을 의미합니다. 그러나이 솔루션은 냄새가 나기 때문에 더 나은 방법이 있어야합니다.
는 여기가 현재 어떻게하는지에 대한 예입니다.
구현의 모든 등록 된 RegisterContainer 방법.
public static void RegisterContainers()
{
// Create a new Simple Injector container
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
SSOSettings ssoSettings = new SSOSettings(
new Uri(ConfigConstants.SSO.FrontendService),
ConfigConstants.SSO.CallbackUrl,
ConfigConstants.SSO.ClientId,
ConfigConstants.SSO.ClientSecret,
ConfigConstants.SSO.ScopesService);
UserSettings userSettings = new UserSettings(
new Uri(ConfigConstants.UserService.Url));
ICacheManager<object> cacheManager = CacheFactory.Build<object>(settings => settings.WithSystemRuntimeCacheHandle());
container.Register<IUserBusiness>(() => new UserServiceBusiness(userSettings));
container.Register<IAccessTokenBusiness>(() => new AccessTokenBusiness(ssoSettings, cacheManager));
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcIntegratedFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
IUserBusiness 및 IAccessTokenBusiness의 구현이 AccountController에 삽입됩니다. 사용자의 연령 업데이트 AccountController에서
private readonly IUserBusiness _userBusiness;
private readonly IAccessTokenBusiness _accessTokenBusiness;
public AccountController(IUserBusiness userBusiness, IAccessTokenBusiness accessTokenBusiness)
{
_userBusiness = userBusiness;
_accessTokenBusiness = accessTokenBusiness;
}
예 엔드 포인트 : 여기
public ActionResult UpdateUserAge(int age)
{
// Get accessToken from the Single Sign On service
string accessToken = _accessTokenBusiness.GetSSOAccessToken();
bool ageUpdated = _userBusiness.UpdateAge(age, accessToken);
return View(ageUpdated);
}
을 그리고 내가 생각 한 몇 가지 아이디어를 다음과 같습니다
서비스에 액세스 토큰 전달 setter를 사용하여 컨트롤러의 생성자에 저장합니다. 예를 들면 다음과 같습니다.
모든 컨트롤러에서이 코드를 복제해야하기 때문에이 아이디어가 마음에 들지 않습니다.
서비스의 모든 방법으로 액세스 토큰을 (현재 이것을 수행 중)으로 전달하십시오. 예 :
public ActionResult UpdateUser(int newAge) { string accessToken = _accessTokenBusiness.GetAccessToken(); _userBusiness.UpdateAge(newAge, accessToken); }
작동하지만 좋지 않습니다.
IAccessTokenBusiness를 서비스 생성자에 전달합니다. 예를 들면 다음과 같습니다.
IAccessTokenBusiness accessTokenBusiness = new AccessTokenBusiness(); container.Register<IUserBusiness>(() => new IUserBusiness(accessTokenBusiness));
그러나 액세스 토큰에 대해 캐싱을 처리하는 방법은 확실하지 않습니다. 아마도 AccessTokenBusiness의 생성자에 일반 ICache 구현을 허용 할 수 있으므로 하나의 캐싱 프레임 워크가 붙어 있지 않습니다.
나는 이것이 청결하고 영리한 방법으로 어떻게 풀릴 수 있는지 듣고 싶습니다.
감사합니다.
당신은 실제로 그 액세스 토큰을 사용하여 몇 가지 논리를 보여줄 수 다음과 같이
더 나아가,
IAccessTokenBusiness
의 장식을 추가 할 수 있습니다 다음과 같은 등록이 보인다? – Steven서비스 (독립적 인 NuGet 패키지)는 모든 요청에 대해 액세스 토큰이 필요한 다양한 서비스의 모든 클라이언트입니다. 한 가지 예가 IUserServiceBusiness의 AddUserAsync입니다. 기본적으로 JSON 데이터로 끝점에 POST하고 베어러 액세스 토큰과 함께 Authroization 헤더를 추가합니다. – raRaRa
일부 코드를 표시하십시오. – Steven