2011-09-26 49 views
3

我有一個類層次結構像這樣(簡化):Ninject綁定約束,搜索後發現一個類型

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並將其應用於Connection。
  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做這個嗎?

回答

2

致電kernel.GetAll您正在創建新的請求。它沒有關於服務上下文的信息。還有就是允許你創建,同時保留原始上下文(Ninject.Extensions.ContextPreservation)

又見https://github.com/ninject/ninject.extensions.contextpreservation/wiki

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

得益於新的請求延期,我不希望有一個擴展添加到項目,有沒有辦法可以「手動」創建保存上下文的子請求? – icedtoast

+1

爲什麼你不想添加擴展?他們是Ninject項目的一部分。並確定有一種方法可以手動執行。做什麼在擴展中完成。但這樣你將不得不自己維護你的代碼。 –