Próbuję wstrzyknąć dependancy w zwyczaju AuthorizeAttribute następująco:wtryskowa nieruchomości na atrybutach
public class UserCanAccessArea : AuthorizeAttribute
{
readonly IPermissionService permissionService;
public UserCanAccessArea() :
this(DependencyResolver.Current.GetService<IPermissionService>()) { }
public UserCanAccessArea(IPermissionService permissionService)
{
this.permissionService = permissionService;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string AreaID =
httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;
bool isAuthorized = false;
if (base.AuthorizeCore(httpContext))
isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);
return isAuthorized;
}
}
To działa, ale wydaje się być rozwiązanie jako pojedyncza czyli mam problemy opisane w moim pervious question
Chciałbym użyć wtrysku właściwości, ale ponieważ mój atrybut nie został rozwiązany przez Unity, nie mogę znaleźć sposobu na skonfigurowanie kontenera do przechwytywania i rozwiązywania właściwości. Próbowałem następujące:
public class UserCanAccessArea : AuthorizeAttribute
{
public IPermissionService permissionService { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string AreaID =
httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;
bool isAuthorized = false;
if (base.AuthorizeCore(httpContext))
isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);
return isAuthorized;
}
}
opakowaniu:
container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));
Ale nieruchomość jest zawsze zerowa przy starcie.
Czy ktoś to osiągnął, a jeśli tak, czy masz przykład?
Odkryłem opcję 1 i wydaje się, że nie można jej użyć, jeśli określono, że element dbcontext ma zostać rozstrzygnięty InRequestScope (Ninject). W przeciwnym razie działa idealnie. Próbowałem go najpierw z lokalizatorem usług (anti-pattern, ale rozwiązuje tworzenie obiektów usługowych). Problem z niestandardowym atrybutem autoryzowanym polega na tym, że został utworzony w czasie wykonywania i nie jest zgodny z InRequestScope. Proszę, popraw mnie jeśli się mylę. –
Chcę użyć opcji InRequestScope, ponieważ chcę mieć jeden i ten sam dbcontext podczas pracy z różnymi repozytoriami i móc korzystać z UnitOfWork - jedno miejsce do wywoływania zapisów w dbcontext. –
Jedną z idei nie jest użycie DI dla usługi, ale wystarczy utworzyć rzeczywisty obiekt używany w filtrze Autoryzacja. Czy to dobre podejście? To sprawi, że mój kod będzie brzydki, ponieważ usługa, którą chcę, ma inne usługi zależne i repozytoriom .... –