为了账号安全,请及时绑定邮箱和手机立即绑定

Unity使用参数将依赖项注入MVC​​过滤器类

Unity使用参数将依赖项注入MVC​​过滤器类

qq_花开花谢_0 2019-10-21 13:13:31
我正在使用Unity.MVC4依赖项注入来访问我的服务。注入Controller构造函数时,一切都应该正常进行,但是我现在想做的是在过滤器类中使用属性注入,以便可以从内部访问数据库。在开始这个问题之前,我在Google周围搜索并尝试了不同的示例,但是找不到适合我的解决方案。Bootstrapper.cspublic static class Bootstrapper{    public static IUnityContainer Initialise()    {        var container = BuildUnityContainer();        DependencyResolver.SetResolver(new UnityDependencyResolver(container));        return container;    }    private static IUnityContainer BuildUnityContainer()    {        var container = new UnityContainer();        container.RegisterType<IAccountRepository, AccountRepository>();        container.RegisterType<IAdministrationRepository, AdministrationRepository>();        container.RegisterType<IUploadDirectlyRepository, UploadDirectlyRepository>();        container.RegisterType<IUserRepository, UserRepository>();        container.RegisterType<INewsRepository, NewsRepository>();        container.RegisterType<IContactRepository, ContactRepository>();        // register all your components with the container here        // it is NOT necessary to register your controllers        // e.g. container.RegisterType<ITestService, TestService>();            RegisterTypes(container);        return container;    }    public static void RegisterTypes(IUnityContainer container)    {    }}我将向您显示的以下代码用于我想在操作中使用的filter属性。我想传递一个字符串数组类型的参数,以便可以验证是否允许当前用户访问该操作。在我的应用程序中,有两种类型的用户,帐户所有者和来宾。所有操作对帐户所有者都是完全开放的,但对于来宾,操作因操作而异。例如,一个操作可能要求您至少具有三个权限之一(读取,写入和编辑)。这不起作用,因为过滤器需要两个参数(IRepository和string [])。显然,这里也不能使用构造函数注入。然后,我尝试实现可在此处找到的John Allers解决方案。看起来很有希望,但是却给了我这个错误:Microsoft.Practices.Unity.dll中发生类型为“ Microsoft.Practices.Unity.ResolutionFailedException”的异常,但未在用户代码中处理附加信息:依赖关系的解析失败,类型=“ Fildela.ClaimsAuthorizeAccountAccess”,名称=“(none)”。发生以下异常:正在解决。异常是:InvalidOperationException-类型为Fildela.ClaimsAuthorizeAccountAccess的属性_accountRepository无法设置。在发生异常时,容器为:解决Fildela.ClaimsAuthorizeAccountAccess,(无)关于如何解决这个坏男孩有什么建议吗?谢谢!
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

首先安装官方软件包,Unity.Mvc而不是Unity.MVC4。该软件包会自动安装并注册UnityFilterAttributeFilterProvider属性注入依赖所需要的软件包。您可以通过查看App_Start> UnityMvcActivator的Start方法来检查Unity是否配置正确。您必须看到以下两行:


public static void Start()

{

    // other codes


    FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());

    FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

}

现在,您可以将[Dependency]属性添加到过滤器的公共属性。


public class ClaimsAuthorizeAccountAccess : AuthorizeAttribute

{

    [Dependency]

    public IAccountRepository AccountRepository { get; set; }

    private String[] _permissions { get; set; }


    public ClaimsAuthorizeAccountAccess(params String[] permissions)

    {

        _permissions = permissions;

    }

}


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 597 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信