使用Ninject 2将参数传递给WCF ServiceHost类型

我想使用Ninject.Wcf扩展来创建参数化服务主机实例。

例如,我有一个MyWCFHandler类,只有以下构造函数:

 public MyWCFHandler(UserManager manager) { _manager = manager; } 

但是当我写var myServiceHost = new ServiceHost(typeof(MyWCFHandler)); 我无法将依赖项对象传递给构造函数。

我不想搞乱我在如何将值传递给我的wcf服务上的构造函数中提供的自定义ServiceHost ?

我决定采用Ninject的方式,但不能完全理解如何在我的情况下采取行动。

以下是我理解Ninject中的WCF扩展的工作原理:

  1. 在我的项目中引用Ninject和Ninject.Extensions.WCF。
  2. 创建一个inheritanceNinject模块的类,并编写如下内容:

    internal class ServiceModule : NinjectModule { public override void Load() { Bind().To().WithConstructorParameters(myUserManagerIwantToUseInWCFHandler); } }

  3. 将使用新ServiceModule()初始化的内核添加到KernelContainer。

  4. 像这样使用NinjectServiceHost:

    var service = KernelContainer.Kernel.Get(); _host = new NinjectServiceHost( service );

在那里我应该准备好我的主人打开。

问题是:

我应该如何将构造函数参数传递给NinjectModule? 当我准备好将参数绑定到它时,我应该创建NinjectModule的实例吗? 如何将它们传递给Get方法?

不幸的是,没有一个示例可以简单地显示参数化的ServiceHost启动。 我甚至不关心它是否是我使用的Ninject。 无论哪种解决方案都有一个很好的例子 – 我很好,因为我只是决定使用什么IoC容器。

关于ninject。 答案取决于您是否需要单个服务或每个请求的新实例。 使用单件服务,您可以执行以下操作:

 public class TimeServiceModule : NinjectModule { ///  /// Loads the module into the kernel. ///  public override void Load() { this.Bind().To(); this.Bind().ToMethod(ctx => ctx.Kernel.Get(new ConstructorArgument("singletonInstance", c => c.Kernel.Get()))); } } internal static class Program { private static void Main() { var kernel = new StandardKernel(new TimeServiceModule()); var serviceHost = kernel.Get(); serviceHost.AddServiceEndpoint(typeof(ITimeService), new NetTcpBinding(), "net.tcp://localhost/TimeService"); try { serviceHost.Open(); } finally { serviceHost.Close(); } } } 

按请求方式:

 public interface IServiceTypeProvider { ///  /// Gets the service types. ///  /// The service types. IEnumerable Types { get; } } Func serviceHostFactory foreach (Type serviceType in this.ServiceTypeProvider.Types) { // I do some magic here to query base contracts because all our service implement a marker interface. But you don't need this. But then you might need to extend the type provider interface. IEnumerable contracts = QueryBaseContracts(serviceType ); var host = this.CreateHost(serviceType); foreach (Type contract in contracts) { Binding binding = this.CreateBinding(); string address = this.CreateEndpointAddress(contract); this.AddServiceEndpoint(host, contract, binding, address); } host.Description.Behaviors.Add(new ServiceFacadeBehavior()); this.OpenHost(host); this.serviceHosts.Add(host); } protected virtual ServiceHost CreateHost(Type serviceType ) { return this.serviceHostFactory(serviceType ); } public class YourWcfModule : NinjectModule { ///  /// Loads the module into the kernel. ///  public override void Load() { this.Bind>().ToMethod( ctx => (serviceType) => ctx.Kernel.Get(new ConstructorArgument("serviceType", serviceType), new ConstructorArgument("baseAddresses", new Uri[] { }))); } } 

玩得开心