Исключить привязку, когда контроллер имеет атрибут - PullRequest
1 голос
/ 10 февраля 2012

У меня есть контроллер

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

Я хотел, чтобы InterfaceA всегда связывался с ClassA, если запрос поступает от контроллера с MyAttribute.Поэтому я сделал вызов.

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

В одном из экземпляров InterfaceB, ClassB, есть такой конструктор.

public ClassB(InterfaceC c)

Я хочу, чтобы InterfaceC связывался с Class C.Контроллер имел MyAttribute.Однако мое предыдущее связывание не будет работать, потому что родительский класс является промежуточным классом, а не самим контроллером.Можно ли в любом случае написать привязку, чтобы она работала из любого места при условии, что вызывающий контроллер имел атрибут?

Редактировать: Мое решение, использующее рекомендации Ремо

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 Ответ

5 голосов
/ 10 февраля 2012

Да, вы можете использовать When(Func<IRequest, bool> condition) вместо этого и написать некоторый пользовательский код.

КогдаClassHas использует следующую функцию:

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

Вы должны расширить это и повторить вконтекст внедрения с использованием request.ParentRequest

...