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

我正在使用Unity.MVC4依赖项注入来访问我的服务。注入Controller构造函数时,一切都应该正常进行,但是我现在想做的是在过滤器类中使用属性注入,以便可以从内部访问数据库。


在开始这个问题之前,我在Google周围搜索并尝试了不同的示例,但是找不到适合我的解决方案。


Bootstrapper.cs


public 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,(无)


关于如何解决这个坏男孩有什么建议吗?


谢谢!


qq_花开花谢_0
浏览 672回答 3
3回答

芜湖不芜

首先安装官方软件包,Unity.Mvc而不是Unity.MVC4。该软件包会自动安装并注册UnityFilterAttributeFilterProvider属性注入依赖所需要的软件包。您可以通过查看App_Start> UnityMvcActivator的Start方法来检查Unity是否配置正确。您必须看到以下两行:public static void Start(){&nbsp; &nbsp; // other codes&nbsp; &nbsp; FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());&nbsp; &nbsp; FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));}现在,您可以将[Dependency]属性添加到过滤器的公共属性。public class ClaimsAuthorizeAccountAccess : AuthorizeAttribute{&nbsp; &nbsp; [Dependency]&nbsp; &nbsp; public IAccountRepository AccountRepository { get; set; }&nbsp; &nbsp; private String[] _permissions { get; set; }&nbsp; &nbsp; public ClaimsAuthorizeAccountAccess(params String[] permissions)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _permissions = permissions;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP