Ограничение Ninject Binding, которое ищет, чтобы найти тип - PullRequest
3 голосов
/ 26 сентября 2011

У меня есть иерархия классов, подобная этой (упрощенно):

class Connection
{
}

interface IService<T>
{
}


class ServiceImplementation : IService<int>
{
   public ServiceImplementation(Connection)
   {
   }
}

interface IConnectionConfiguration
{
   public void Configure(Connection c)
}

class ConnectionConfiguration : IConnectionConfiguration
{
   public void Configure(Connection c)
}

Где у меня есть несколько реализаций IConnectionConfiguration и IService.Я хочу создать провайдера / привязок, который:

  1. создает новый экземпляр Connection.
  2. GetAll и применяет его к подключению.
  3. Привязки указывают, какиеИспользуемые реализации IConnectionConfiguration, основанные на типе создаваемого IService

В настоящее время у меня есть реализация провайдера, подобная этой:

public Connection CreateInstance(IContext context)
{
     var configurations = context.Kernel.GetAll<IConnectionConfiguration>()
     var connection = new Connection();
     foreach(var config in configurations)
     {
        config.Configure(connection);
     }

     return connection;
}

Но когда я пытаюсь сделатьконтекстная привязка для IConnectionConfiguration не имеет родительского запроса или родительского контекста ...

Bind<IConnectionConfiguration>().To<ConcreteConfiguration>().When(ctx => {
 // loop through parent contexts and see if the Service == typeof(IService<int>);
 // EXCEPT: The ParentRequest and ParentContext properties are null.
});

Что я здесь не так делаю?Могу ли я сделать это с помощью ninject?

1 Ответ

2 голосов
/ 03 октября 2011

Позвонив по номеру kernel.GetAll, вы создаете новый запрос.У него нет информации о контексте службы.Существует расширение, позволяющее создавать новые запросы с сохранением исходного контекста (Ninject.Extensions.ContextPreservation)

См. Также https://github.com/ninject/ninject.extensions.contextpreservation/wiki

context.GetContextPreservingResolutionRoot().GetAll<IConnectionConfiguration>();
...