【问题标题】:Ninject .Net 3.5 SOAP Webservice issuesNinject .Net 3.5 SOAP Web 服务问题
【发布时间】:2012-10-27 11:39:20
【问题描述】:

这是我第一次在这里发帖,相信我,我已经到处搜索了我的问题的答案,但收效甚微。

背景:我目前已经开始尝试重构我们现有的 SOAP Web 服务(.Net 3.5),以便使用 Ninject 进行一些 IOC 和 DI。我有一个 CacheManager,我试图在 web 方法中初始化它,但是注入似乎没有启动。

我有一个控制台应用程序,它使用以下内容调用 Web 服务:

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

        DataResult result = service.GetSomething(1);
    }

网络服务如下: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继承Base来初始化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;
    }

}  

每次我运行控制台应用程序并点击 GetSomethingCacheManager 为空。为什么我调用 web 方法时没有发生注入?

【问题讨论】:

  • 我目前没有看到您在“return this.CacheManager.Get();”行中调用的 CacheManager 变量的初始化如果要进行构造函数注入,则应在构造函数中对其进行初始化。
  • 啊抱歉,我遗漏了初始化 CacheManager 的 Base 类。我现在已经编辑了帖子。
  • 唯一可以导致注入的东西是Kernel.GetKernel.Inject[Inject] 位仅在其中一种顶级方法触发它时告诉它在哪里注入。立即购买manning.com/seemann。特定于 WCF 的东西,您是否在 .svc.cs 中设置了 NinjectControllerFactory 链接?您是否查看过 Ninject WCF 示例并尝试将您的代码拉入其中?
  • 抱歉,您的 Factory Factory 让我假设 WCF。不知道是否/在哪里可以找到一个好的基于 ASMX 的样本,但同样的原则适用——你需要从某些东西等中派生出一些东西,以便调用 Ninject 来进行注入——属性本身就在那里什么都不做。

标签: c# asp.net web-services .net-3.5 ninject


【解决方案1】:

团队的另一位成员最终在这里的另一个线程中偶然发现了这一点:

How can I implement Ninject or DI on asp.net Web Forms?

我所缺少的只是在我的 TestService Web 服务类上继承 WebServiceBase!

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多