繁体   English   中英

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

[英]Setter Property Required primitive dependency is not explicitly defined

我有Asp.Net MVC应用程序,我使用了structuremap,我使用自定义ThrottleAttribute ActionFilter。 遵循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属性'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)
                );
        });
    }
}

例外情况是:容器.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属性'Time'(ActionFilters.TimeUnit):未明确定义必需的原始依赖项

我该怎么办?

如何明确定义PrimitiveTypes?

问题在于在结构图中注册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));
        });
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM