2014-11-05 4 views
0

Если я получаю привязки для типа интерфейса из конкретного экземпляра ядра Ninject, есть ли способ проверить, какой тип привязки он (например: InSingletonScope(), InRequestScope())?Проверьте, является ли привязка Ninject InRequestScope

(упрощенный) пример:

IKernel kernel = NinjectWebCommon.CreateKernel(); 
var binding = kernel.GetBindings(typeof(IService)).FirstOrDefault(); 

var bindingType = binding...?? 

ответ

1

.InRequestScope() сам называет: IBindingSyntax.InScope(Func<IContext, object> scope);

В ScopeCallback (Func<IContext, object> scope) могут быть получены с помощью:

kernel 
    .GetBindings(typeof(IService)) 
    .Single() 
    .ScopeCallback 

Но сравнивая Func не очень хорошая вещь , Он чувствует себя очень хак, но мы можем сделать следующие действия для получения области действия запроса обратного вызова для сравнения:

private Func<IContext, object> RetrieveInRequestScopeCallback() 
{ 
    using (var kernel = new StandardKernel()) 
    { 
     kernel.Bind<object>().ToSelf().InRequestScope(); 
     return kernel.GetBindings(typeof(object)).Single().ScopeCallback; 
    } 
} 

теперь тестовый модуль как следующий будет проходить:

[Fact] 
public void Foo() 
{ 
    Func<IContext, object> inRequestScopeCallback = RetrieveInRequestScopeCallback(); 

    var kernel = new StandardKernel(); 
    kernel.Bind<string>().ToSelf().InRequestScope(); 

    IBinding binding = kernel.GetBindings(typeof(string)).Single(); 
    binding.ScopeCallback.Should().Be(inRequestScopeCallback); 
} 

(я использовал FluentAssertions и xunit)

Но, как я уже сказал, это хаки. Почему вы хотите проверить привязки? Я предлагаю, что было бы лучше инвестировать это время в создание автоматизированных интеграционных/системных тестов. Обычно это путь к контейнерам DI: вы не проверяете, правильно ли вы их настроили, вы проверяете это с помощью интеграционных и системных тестов.

+0

Я хотел удостовериться, что класс с одноразовыми зависимостями сам связан с 'InRequestScope()', чтобы избежать одноразовых зависимостей, имеющих срок службы дольше, чем один запрос. Я понимаю, что когда, например, тип с привязкой 'InSingletonScope()' имеет зависимость с привязкой 'InRequestScope()', эта зависимость действительно не будет удаляться в конце запроса (из-за класса на котором живет эта зависимость). Я хотел написать тест, чтобы разработчик не забыл, что это вызывает неожиданное поведение. Если есть другой способ, дайте мне знать. – bump

+3

@bump вы ищете [зависимые ссылки] (http://blog.ploeh.dk/2014/06/02/captive-dependency/). [Замок] (http://docs.castleproject.org/Windsor.MainPage.ashx) и [Простой инжектор] (https://simpleinjector.org) имеют встроенные механизмы обнаружения. – qujck

+1

yes @qujck прав. Если это действительно важно для вас, я бы переключился на одну из фреймворков, которые он упомянул, или создать соответствующий запрос на тяну. К сожалению, я думаю, что запросы на Ninject pull потребуют очень много времени, чтобы пройти/принять. – BatteryBackupUnit

Смежные вопросы