控制器具有属性时的Ninject绑定

时间:2012-02-10 01:07:03

标签: asp.net-mvc-3 ninject

我有一个控制器

[MyAttribute]
public class MyController: Controller
{
    public MyController(InterfaceA a, InterfaceB b)
    {
    }
}

如果请求来自具有MyAttribute的控制器,我希望InterfaceA始终绑定到ClassA。所以我打了电话。

Bind<InterfaceA>.To<ClassA>().WhenClassHas<MyAttribute>();

InterfaceB的一个实例化,ClassB,有一个像这样的构造函数。

public ClassB(InterfaceC c)

当被调用的控制器具有MyAttribute时,我希望InterfaceC绑定到C类。但是,我以前的绑定不起作用,因为父类是中间类,而不是控制器本身。反正有没有写绑定所以如果调用控制器具有属性?

它将在任何地方工作

编辑:我的解决方案使用Remo的建议

public static IBindingInNamedWithOrOnSyntax<TBinding> WhenControllerHasAttribute<TBinding>(this IBindingWhenSyntax<TBinding> instance, Type type)
{
    Func<IRequest, bool> hasAttribute = (request) =>
    {
        while (request.ParentRequest.Target != null)
        {
            request = request.ParentRequest;
        }
        return request.Target.Member.ReflectedType.IsDefined(type, false);
    };
    return instance.When(hasAttribute);
}

1 个答案:

答案 0 :(得分:5)

是的,您必须使用When(Func<IRequest, bool> condition)代替并编写一些自定义代码。

WhenClassHas使用以下Func:

request => request.Target.Member.ReflectedType.HasAttribute(attributeType)

您必须使用request.ParentRequest

对此进行扩展并在注入上下文中进行迭代