Sto cercando di iniettare una dipendenza in un personalizzato AuthorizeAttribute come segue:iniezione Property di attributi
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;
}
}
Questo funziona, ma sembra essere la risoluzione come un Singleton senso ottengo i problemi descritti nel mio pervious question
Quello che mi piacerebbe fare è usare l'iniezione di proprietà ma poiché il mio Attributo non è stato risolto da Unity, non sono in grado di trovare un modo per configurare il contenitore per intercettare e risolvere una proprietà. Ho provato quanto segue:
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;
}
}
Contenitore:
container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));
Ma la proprietà è sempre nullo in fase di esecuzione.
Qualcuno ha raggiunto questo e in caso affermativo avete un esempio?
Ho esplorato l'opzione 1 e sembra che questo non possa essere utilizzato se è stato specificato che il dbcontext sia risolto in InRequestScope (Ninject). Altrimenti funziona perfettamente. L'ho provato dapprima con il localizzatore di servizi (anti-pattern, ma risolve la creazione di oggetti di servizio). Il problema con l'attributo autorizzato personalizzato è che è stato creato in fase di runtime e non segue InRequestScope. Perfavore, correggimi se sbaglio. –
Voglio usare l'opzione InRequestScope, perché voglio avere uno e lo stesso dbcontext quando lavori con repository diversi, ed essere in grado di usare UnitOfWork - un posto dove chiamare i savechanges nel dbcontext. –
Un'idea non è usare DI per il servizio, ma solo creare un oggetto reale usato nel filtro Autorizzazione. E 'un buon approccio? Renderà il mio codice brutto come il servizio che voglio avere altri servizi e repository dipendenti .... –