未明确定义Setter Property Required原始依赖关系

时间:2016-11-03 14:42:43

标签: c# asp.net-mvc structuremap

我有Asp.Net MVC应用程序,我使用了结构图, 我使用自定义ThrottleAttribute ActionFilter。 关注rate limiting in asp.net mvc

public enum TimeUnit
{
    Minute = 60,
    Hour = 3600,
    Day = 86400
}

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class ThrottleAttribute : ActionFilterAttribute
{
    public TimeUnit Time { get; set; }
    public int Count { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var seconds = Convert.ToInt32(Time);

        var key = string.Join(
            "-",
            seconds,
            filterContext.HttpContext.Request.HttpMethod,
            filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
            filterContext.ActionDescriptor.ActionName,
            filterContext.HttpContext.Request.UserHostAddress
        );

        // increment the cache value
        var cnt = 1;
        if (HttpRuntime.Cache[key] != null)
        {
            cnt = (int)HttpRuntime.Cache[key] + 1;
        }
        HttpRuntime.Cache.Insert(
            key,
            cnt,
            null,
            DateTime.UtcNow.AddSeconds(seconds),
            Cache.NoSlidingExpiration,
            CacheItemPriority.Low,
            null
        );

        if (cnt >= Count)
        {

            filterContext.Result = new ContentResult
            {
                Content = "You are allowed to make only " + Count + " requests per " + Time.ToString().ToLower()
            };
            filterContext.HttpContext.Response.StatusCode = 429;
        }
    }
}

使用ThrottleAttribute后抛出异常:

  

Setter Property'Time'(ActionFilters.TimeUnit):未明确定义所需的原始依赖

我的ActionFilter注册表:

public class ActionFilterRegisteryClass : StructureMap.Registry
{
    public ActionFilterRegisteryClass(Func<StructureMap.IContainer> containerFactory)
    {
        For<IFilterProvider>().Use(
            new StructurMapFilterProvider(containerFactory));

        Policies.SetAllProperties(x =>
        {
            x.Matching(p =>
                p.DeclaringType.CanBeCastTo(typeof(ActionFilterAttribute)) &&
                (
                    p.DeclaringType.Namespace.StartsWith("MyNamespace")
                ) &&
                !p.PropertyType.IsPrimitive &&
                p.PropertyType != typeof(string)
                );
        });
    }
}

异常是火:container.BuildUp(filter.Instance);

public class StructurMapFilterProvider : FilterAttributeFilterProvider
{
    private readonly Func<StructureMap.IContainer> _Container;

    public StructurMapFilterProvider(Func<StructureMap.IContainer> container)
    {
        _Container = container;
    }

    public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext,
        ActionDescriptor actionDescriptor)
    {
        var filters = base.GetFilters(controllerContext, actionDescriptor);

        var container = _Container();

        foreach (var filter in filters)
        {
            container.BuildUp(filter.Instance);

            yield return filter;
        }
    }
}
  

Setter Property'Time'(ActionFilters.TimeUnit):未明确定义所需的原始依赖

我该怎么办?

如何明确定义PrimitiveTypes?

1 个答案:

答案 0 :(得分:1)

问题在于在结构图中注册ActionFilterClass。我已将其更改如下:

public class ActionFilterRegisteryClass : StructureMap.Registry
{
    public ActionFilterRegisteryClass(Func<StructureMap.IContainer> containerFactory)
    {
        For<IFilterProvider>().Use(
            new StructurMapFilterProvider(containerFactory));

        Policies.SetAllProperties(x =>
        {
            x.Matching(p =>
                p.DeclaringType.CanBeCastTo(
                !p.PropertyType.IsPrimitive &&
                !p.PropertyType.IsEnum &&
                p.PropertyType != typeof(string));
        });
    }
}