代码之家  ›  专栏  ›  技术社区  ›  GONeale

使用Ninject(从Windsor移动)时出现WCF服务问题(InvalidOperationException)

  •  2
  • GONeale  · 技术社区  · 15 年前

    我最近一直试图将WCF服务应用程序和Windows窗体客户端应用程序从Castle Windsor依赖注入转换为Ninject。

    System.InvalidOperationException:找不到类型“WcfMemberService”,该类型在ServiceHost指令中作为服务属性值提供,或在配置元素System.serviceModel/serviceHostingEnvironment/serviceActivations中提供。

    我所拥有的代码(例如我的WcfMemberService)是我认为正确的访问代码,如下所示:

    服务模块.cs:

    public class ServiceModule : NinjectModule
    {
        private IKernel _parentContainer;
        public ServiceModule(IKernel container)
        {
        this._parentContainer = container;
        }
    
        public override void Load()
        {
        Bind<IDataContextProvider>().To<DataContextProvider>()
            .WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
        Bind(typeof(IRepository<>)).To(typeof(Repository<>));
        Bind<IServiceLocator>().ToConstant(new NinjectServiceLocator(_parentContainer));
        Bind<IUserService>().To<UserService>();
    
        // ** WCF Services **
        Bind<Business.Common.Wcf.Services.Contracts.IMemberServiceContract>().To<Business.Common.Wcf.Services.MemberService>().InSingletonScope().Named("WcfMemberService");
        }
    }
    

    我做的假设是,当我从温莎城堡的工作结构转换过来时 Named() 应该是您的WCF声明中的相同条目 .svc 文件。所以我做了如下工作:

    <%@ ServiceHost Language="C#" Service="WcfMemberService" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
    

    很简单,我从Ninject Wcf Extensions GitHub页面上的TimeService示例解决方案中采用了这种方法 here

    有人知道我在这里做错了什么吗?为什么“WcfMemberService”无法解决?它在内核中绑定为“WcfMemberService”,并在@ServiceHost声明中引用。我看不出还有什么问题。这与我在温莎城堡中的声明完全相同,只是语法大致不同,但两者都使用 命名() 两人都在 .svc公司 文件。

    更新 * 我发现如果我不使用 接近,然后简单地设置我的服务 @ ServiceHost 声明为 Business.Common.Wcf.Services.MemberService, Business.Common.Wcf.Services

    顺便说一下,我的Ninject模块是通过 Global.asax.cs

    public class Global : NinjectWcfApplication
    {
        #region Overrides of NinjectWcfApplication
    
        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        protected override IKernel CreateKernel()
        {
            // config to reside in executing directory
            log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
            var _container = new StandardKernel();
            _container.Load(new ServiceModule(_container));
            //_container.Load(new Log4netModule());
            ServiceLocator.SetLocatorProvider(() => _container.Get<IServiceLocator>());
    
            return _container;
        }
    
        #endregion
    }
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Ian Davis    15 年前

    .Named(string)语法用于条件绑定。例如,如果

    Bind<IService1>().To<MyService>().Named("MyServiceImpl");
    Bind<IService1>().To<DefaultService();
    

    然后,除非您具有以下内容,否则将作为默认值注入DefaultService:

    class MyForm([Named("MyServiceImpl")] IService1 service){...}
    

    kernel.Get<IService1>(metadata => metadata.Name == "MyServiceImpl");
    

    kernel.Get<IService1>("MyServiceImpl");
    

    -伊恩

    推荐文章