2014-02-10 66 views
1

我有一個麻煩的Windows服務(see this question),我正在考慮創建一個自定義作用域工廠,以在每次服務打勾時生成一個新作用域。在內核中註冊Ninject內核可以嗎?

我打算把內核注入到這個工廠,這樣它就可以在每次打勾時爲服務返回一個新的作用域,並在每次打勾後銷燬/釋放作用域。

爲方便起見,我打算將此添加到我的RegisterServices()方法:

kernel.Bind<IKernel>().ToConstant(kernel);

而且我的自定義範圍廠應該是這樣的:

public class CustomScopeFactory : ICustomScopeFactory 
{ 
    private readonly IKernel kernel; 

    public CustomScopeFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public ICustomScope CreateScope() 
    { 
     return kernel.Get<ICustomScope>(); 
    } 

    public void DisposeScope(ICustomScope scope) 
    { 
     kernel.Release(scope); 
    } 
} 

我不會通常考慮將內核註冊到內核或注入內核,但在這種情況下,我認爲這是一個有效的用例。

那麼,在內核本身註冊Ninject內核可以嗎?任何想法或替代品將不勝感激。

+0

我不認爲這是一個正常的_Service Locator_ ..因爲你是注射容器本身。你的選擇是注入一個'IDependencyResolver'或類似的東西..使它獨立於容器(如果這就是你的目標)。 –

+0

除了'IKernel'接口,您可以使用'IResolutionRoot'接口。我認爲它已經被註冊了,所以你甚至不需要爲它創建一個綁定。 – BatteryBackupUnit

+0

@BatteryBackupUnit使用''''IResolutionRoot''''代替''''IKernel''''有什麼好處? –

回答

3

您無需註冊IKernel。它會自動注入任何具有IKernel依賴項(構造函數,字段或屬性)的容器創建的類。

+0

我檢查了[source](https://github.com/ninject/ninject/blob/master/src/Ninject/KernelBase.cs#L91-L92),並且'IKernel'和'IResolutionRoot'都已經註冊。 –

+0

的確,它們已經由Ninject在激活一個依賴'IKernel'或'IResolutionRoot'的實例時提供。 – cvbarros