2012-11-07 76 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示例并试图在那里提取你的代码吗? –

回答