行动过滤器简单的注射器注射财产(Simple Injector property injection

2019-06-27 07:26发布

该行为过滤我希望注入开始喜欢这个

public class UserAuthorisation : AuthorizeAttribute
{
    public IWcfClientProxy<IAppFrameworkServiceChannel>
        FrameworkServiceProxy { get; set; }

我已经安装我的容器是这样的:

container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(
    ()=> new WcfClientProxy<IAppFrameworkServiceChannel>());

container.RegisterInitializer<UserAuthorisation>(handler =>
{
    handler.FrameworkServiceProxy = container
       .GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});

当我运行这个FrameworkServiceProxy属性为null。

我已阅读这篇文章: 简单的喷油器:注射在基类的属性和遵循的答案。 我也曾在此页面读取例如简单的喷油器文档 。

我不是注入到一个基类,也许这是问题?

## UPDATE ##

我加入了更多的信息,我认为应该从什么史蒂文斯回答有人说工作。

我现在用的NuGet包的MVC 3,这增加了以下内容的应用:

public static class SimpleInjectorInitializer
{
    /// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
    public static void Initialize()
    {
        var container = new Container();
        InitializeContainer(container);
        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
        container.RegisterMvcAttributeFilterProvider();
        container.Verify();
        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
    }

    private static void InitializeContainer(Container container)
    {
        container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(() => new WcfClientProxy<IAppFrameworkServiceChannel>());
        container.RegisterInitializer<UserAuthorisation>(handler =>
            {
                handler.FrameworkServiceProxy = container.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
            });
    }

这包括container.RegisterMvcAttributeFilterProvider(); 作为我现在明白了,应该注册一个过滤器供应商,应该意味着过滤器通过容器创建(这种认识可能是错误的),然后属性将自动有线了。

我的过滤器注册在Global.asax.cs中,像这样:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new UserAuthorisation());
}

在我看来,那是不是由容器所创建的过滤器,所以我想我需要做别的事情让这样的事情发生?

Answer 1:

您正在注册您的初始化UserAuthorisation属性。 然而初始化,当通过容器本身产生的类型仅用于由容器。 由于属性是由CLR创建,初始化不会熄灭。

所述SimpleInjector.Integration.Web.Mvc.dll( 此NuGet包 )含有RegisterMvcAttributeFilterProvider扩展方法。 这将注册的AttributeFilterProvider ,将做隐式属性注入(和调入container.InjectProperties方法)。 打完电话后container.RegisterMvcAttributeFilterProvider()你会看到,这个属性被自动注入。



Answer 2:

我选择了史蒂文斯回答的答案,因为它让我一个解决方案,我现在用的是他在评论中提到的命令处理程序。

我已经把一个简单的解决办法在让我注射全局过滤器。

在App_Start \ SimpleInjectorInitializer.cs我加入RegisterGlobalFilters是这样的:

public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
{
    //Add simple injector resolved types.
    filters.Add(container.GetInstance<UserAuthorisation>());
}

并且在Initialize方法我已经加入此RegisterGlobalFilters(GlobalFilters.Filters, container);

完整的方法是这样的:

/// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
    var container = new Container();
    InitializeContainer(container);
    container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
    container.RegisterMvcAttributeFilterProvider();
    container.Verify();
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

    RegisterGlobalFilters(GlobalFilters.Filters, container);
}

就像我说的很简单。 刚拿到从简单的注入我的实例,然后将它们添加到全局列表,我肯定有更好的方法来做到这一点。

这种方式并不意味着你不需要改变这可能是一件好事的global.asax.cs。



文章来源: Simple Injector property injection on action filter