2012-11-07 73 views
1

這是我第一次在這裏發佈並相信我,我已經搜索了高和低的答案我的問題,但沒有什麼成功。Ninject .Net 3.5 SOAP Webservice問題

背景:我目前開始嘗試重新考慮我們現有的SOAP Web服務(.Net 3.5),以便使用Ninject來完成一些IOC和DI。我有我試圖在Web方法initalize一個CacheManager的,但注射似乎沒有踢

我有一個調用與下面的Web服務的控制檯應用程序。

static void Main(string[] args) 
    { 
     TestService service = new CachingService.TestService(); 

     DataResult result = service.GetSomething(1); 
    } 

的web服務是如下:TestService.asmx.cs

[WebMethod(Description = "Get something")] 
public DataResult GetSomething(int param) 
{ 
    try 
    { 
     return this.CacheManager.Get(); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

Base.cs(TestService.asmx.cs繼承基地初始化的CacheManager)

public class Base 
{ 
    [Inject] 
    public ICacheManager CacheManager 
    { 
     get 
     { 
      if (cacheProxy == null) 
      { 
       cacheProxy = new CacheProxy(); 
      } 
      return cacheProxy.CacheManager; 
     } 
    } 
} 

CacheProxy.cs

public class CacheProxy 
{ 
    [Inject] 
    public ICacheManager CacheManager { get; set; } 
} 

CacheManager.cs

public class CacheManager : ICacheManager 
{ 
    //implements iCacheManager methods 
} 

App_Start/NinjectWebCommon.cs

private static void RegisterServices(IKernel kernel) 
    { 
kernel.Bind<ICacheManager>() 
      .ToMethod(x => x.Kernel.Get<ICacheManagerFactoryBuilder>().GetCacheManagerFactory().CreateCacheManager()) 
      .InRequestScope(); 
} 

CacheManagerFactoryBuilder.cs

public class CacheManagerFactoryBuilder : ICacheManagerFactoryBuilder 
{ 
    private ICacheManagerFactory _Factory; 

    public CacheManagerFactoryBuilder(ICacheManagerFactory factory) 
    { 
     _Factory = factory; 
    } 

    public ICacheManagerFactory GetCacheManagerFactory() 
    { 
     return _Factory; 
    } 
} 

個CacheManagerFactory.cs

public class CacheManagerFactory : ICacheManagerFactory 
{ 
    private readonly ICacheManager Manager; 

    public CacheManagerFactory(ICacheManager manager) 
    { 
     if (this.Manager == null) 
     { 
      this.Manager = manager; 
     } 
    } 

    public ICacheManager CreateCacheManager() 
    { 
     return this.Manager; 
    } 

} 

每次我運行控制檯應用程序和它擊中GetSomething的CacheManager爲空。爲什麼當我調用web方法時,注入不會發生?

+0

我目前沒有看到你在調用「return this.CacheManager.Get();」行的CacheManager變量的初始化。如果你正在做構造函數注入,它應該在構造函數中初始化。 – Kristof

+0

對不起,我遺漏了啓動CacheManager的Base類。我現在編輯了這篇文章。 – Nanz

+0

唯一可能導致某些內容被注入的是一個'Kernel.Get'或一個'Kernel.Inject'。當其中一個頂級方法觸發時,'[Inject]'位只會告訴它在哪裏進行注入。現在購買http://manning.com/seemann。具體到WCF的東西,你是否在'.svc.cs'中設置NinjectControllerFactory鏈接?你看過Ninject WCF示例並試圖在那裏提取你的代碼嗎? –

回答