それらをアクションからコントローラー クラスまたは管理者アクションの基本コントローラー クラスに移動することを検討できます。そうすれば、個々のアクション メソッドではなく、コントローラ クラスでAuthorize
と属性の両方を設定するだけです。AdminLayout
[Authorize]
[AdminLayout]
public AdminController: Controller
{
//action methods
}
承認といくつかのカスタム レイアウト ロジックを組み合わせた属性を持つことは、単一責任の原則の破綻と見なされる可能性がありますが、他に選択肢がない場合は、次のアプローチを試すことができます。
AdminLayoutAttribute
既存のものを新しいに置き換えたい場合AdminAttribute
は、 を作成しAdminAttribute
て標準から継承しAuthorizeAttribute
、カスタム AdminLayoutAttribute のように IActionFilter\IResultFilter を実装することもできます。
public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter
{
//Logic as in existing AdminLayoutAttribute to be replaced
}
それ以外の場合は、既存のものを保持し、それを と組み合わせAdminLayoutAttribute
た新しいものを追加する場合は、カスタム属性から継承し、タイプ AuthorizationFilter の内部インスタンスを呼び出して IAuthorizationFilter を実装できます。AdminAttribute
AuthorizeAttribute
public class AdminLayoutAttribute: AdminLayoutAttribute, IAuthorizationFilter
{
//Implement IAuthorizationFilter by delegating to an internal AuthorizeFilter instance
private _authorizeFilter = new AuthorizeAttribute();
public override object TypeId
{
//override from base Attribute class as in AuthorizeAttribute class
get { return _authorizeFilter.TypeId ; }
}
public string Roles
{
get { return _authorizeFilter.Roles; }
set { _authorizeFilter.Roles = value; }
}
public string Users
{
get { return _authorizeFilter.Users; }
set { _authorizeFilter.Users = value; }
}
public void OnAuthorization(AuthorizationContext filterContext)
{
_authorizeFilter.OnAuthorization(filterContext);
}
}
両方のオプションで重要なのは、C# では多重継承がサポートされていないため、新しい AdminAttribute クラスが 2 つの具象クラスから継承されないようにすることです。