2015-05-02 15 views
1

我想知道最佳實踐在這裏。 我需要構建的DbContext我的多租戶應用程序,所以我已經做了相關供應商這樣的:Ninject Providers - >獲取提供者內部的另一個依賴關係

public class TenantContextFactoryProvider : Provider<DbContext> 
{ 
    protected override DbContext CreateInstance(IContext context) 
    { 
     var tenant = // How to get the tenant through ninject?? 
     return new DbContext(tenant.ConnectionString); 
    } 
} 

我需要ninject解決租戶的依賴,但我不知道如何做到這一點?

回答

2

雖然服務定位器一定的工作原理,構造函數注入是另一種選擇。

public class TenantContextFactoryProvider : Provider<DbContext> 
{ 
    ITenant tenant; 
    public TenantContextFactoryProvider(ITenant tenant) 
    { 
     this.tenant = tenant; 
    } 

    protected override DbContext CreateInstance(IContext context) 
    { 
     return new DbContext(tenant.ConnectionString); 
    } 
} 
+0

不錯,我不知道你能做到這一點,我錯誤地認爲,當我進入ninject時,我無法訪問這些功能。 –

2

這有點尷尬,但我想如果它可能發生在我身上,它也可能發生在其他人身上。

我忘了包含using Ninject,這就是爲什麼在IntelliSense中沒有顯示擴展方法context.Kernel.Get的原因。

所以我的代碼最終看上去像這樣:

using Ninject; 
public class TenantContextFactoryProvider : Provider<DbContext> 
{ 
    protected override DbContext CreateInstance(IContext context) 
    { 
     var tenant = context.Kernel.Get<ITenant>(); 
     return new DbContext(tenant.ConnectionString); 
    } 
} 
+0

所以答案是使用服務定位器的提供者依賴? – liang

+0

是的,我的問題的答案是我忘了將Ninject包含在.cs文件中。沒什麼特別:)只是一個'大腦屁'。 –

+0

我認爲更好的方法可能是使用構造函數注入而不是服務定位器。 – liang

相關問題