次のように依存関係をカスタムAuthorizeAttribute
に挿入しようとしています。
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;
}
}
これは機能しますが、シングルトンとして解決しているようです。つまり、私の説明した問題が 前の質問
プロパティインジェクションを使用したいのですが、属性自体がUnityで解決されないため、プロパティをインターセプトして解決するようにコンテナーを構成する方法を見つけることができません。私は以下を試しました:
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;
}
}
容器:
container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));
ただし、このプロパティは実行時には常にnullです。
誰かがこれを達成しましたか?そうであればあなたは例を持っていますか?
属性への依存性注入を完全に行わないようにする必要があります。この理由については、この記事で説明しています 属性への依存性注入:しないでください! 。要約すると、この記事では次のことが説明されています。
ここでは2つの選択肢があります。
AuthorizeCore
)がサービスロケーター/ DependencyResolverからサービスを解決し、サービスのメソッドを呼び出す以外に何もさせません。ここで注意すべき重要な点は、コンストラクター注入、プロパティ注入を実行できず、サービスを属性プライベート状態に格納できないことです(既にお気づきのとおり)。使用するオプション: