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

2023-12-27

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

例如我有一堂课MyWCFHandler仅有以下构造函数:

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

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

我不想弄乱像中提供的自定义 ServiceHost如何将值传递给 wcf 服务上的构造函数? https://stackoverflow.com/questions/2454850/how-do-i-pass-values-to-the-constructor-on-my-wcf-service

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

以下是我对 Ninject 中 WCF 扩展的理解:

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

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

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

  4. 像这样使用 NinjectServiceHost:

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

在那里我应该准备好我的主机以供打开。

问题是:

我应该如何将构造函数参数传递到 NinjectModule 中?当我准备好将参数绑定到 NinjectModule 时,是否应该立即创建一个 NinjectModule 实例?如何将它们传递给 Get 方法?

不幸的是,没有一个示例可以简单地显示参数化的 ServiceHost 启动。我什至不在乎我用的是不是Ninject。无论哪个解决方案都有一个很好的例子 - 我对此很满意,因为我只是决定使用哪个 IoC 容器。


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

public class TimeServiceModule : NinjectModule
{
    /// <summary>
    /// Loads the module into the kernel.
    /// </summary>
    public override void Load()
    {
        this.Bind<ITimeService>().To<TimeService>();

        this.Bind<ServiceHost>().ToMethod(ctx => ctx.Kernel.Get<NinjectServiceHost>(new ConstructorArgument("singletonInstance", c => c.Kernel.Get<ITimeService>())));
    }
}

internal static class Program
{
    private static void Main()
    {
        var kernel = new StandardKernel(new TimeServiceModule());

        var serviceHost = kernel.Get<ServiceHost>();
        serviceHost.AddServiceEndpoint(typeof(ITimeService), new NetTcpBinding(), "net.tcp://localhost/TimeService");
        try
        {
            serviceHost.Open();
        }
        finally
        {
            serviceHost.Close();
        }
    }
}

按请求方法:

public interface IServiceTypeProvider
{
    /// <summary>
    /// Gets the service types.
    /// </summary>
    /// <value>The service types.</value>
    IEnumerable<Type> Types { get; }
}

Func<Type, ServiceHost> 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<Type> 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
{
    /// <summary>
    /// Loads the module into the kernel.
    /// </summary>
    public override void Load()
    {

        this.Bind<Func<Type, ServiceHost>>().ToMethod(
            ctx =>
            (serviceType) =>
            ctx.Kernel.Get<NinjectServiceHost>(new ConstructorArgument("serviceType", serviceType), new ConstructorArgument("baseAddresses", new Uri[] { })));
    }
}

Have fun

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ninject 2 将参数传递给 WCF ServiceHost 类型 的相关文章

随机推荐

  • 检查 Python 字典是否具有相同的形状和键

    对于单层字典 例如x a 1 b 2 这个问题很简单并且可以回答 检查两个字典是否具有相同的键集的 Pythonic 方法 https stackoverflow com questions 3210832 pythonic way to
  • style 属性中的 Angular Bug IE10 变量

    如果我做这样的事情 div style margin left 50px TEST1 div div style margin left 0px TEST2 div http jsfiddle net XeVHL 1 http jsfidd
  • 同一列 SQL 中 2 个日期的 DateDiff

    使用 SQL Server 2005 我需要获得datediff对于同一列中的 2 个日期 表格如下所示 OrderNo OpNo ResType LoadedStartDate 12345 1 PAINT 2014 05 01 00 00
  • Javascript:运行函数后添加“false”

    我正在分析一个插件 因为我想修改它 我看到各种事件触发函数如下 document getElementById this config form addEventListener submit this submit false 我的问题是
  • 如何降低捏缩放 UIGestureRecognizer 的速度

    I ve created a UIGestureRecognizer much like this one https stackoverflow com questions 5150642 max min scale of pinch z
  • 在 PHP 中使用 vs include 作为导入语句

    我有两个简单的文件 文件1 php
  • 声明为属性时如何初始化 NSArrays / NSMutableArrays

    我需要一些帮助来理解如何使用 NSArrays NSMutableArrays 作为属性 数组应该具有哪些属性 强属性还是复制属性 在什么情况下我应该使用哪个属性 如何在代码中初始化数组 我的属性数组应该是 NSArray 还是 NSMut
  • 我可以在 Spring MVC 的拦截器中使用 RedirectAttributes 或 FlashMap

    我有一个拦截器来处理用户会话 如果user属性不存在 那么拦截器将重定向到登录页面 我想发送一个session timeout带有重定向 url 的消息 但我不希望 url 中包含该消息 我用谷歌搜索了很多RedirectAttribute
  • 检测到屏幕覆盖层会阻止 Android 权限

    我注意到我的新手机上的 Android 应用程序出现了一个奇怪的问题 SDK 23 权限弹出窗口 例如外部存储 被下面附加的警报阻止 我最初以为这与我的手机有关 但它似乎并没有影响我安装的任何其他应用程序 这个问题可能与安装了调试版本有关
  • 如何使用 django 在网络浏览器上推送通知

    我在 Django 中创建了一个 Todo Web 应用程序 并将其部署在 Heroku 上 我想知道如何在浏览器中推送即将执行的任务的通知 提前致谢 您应该使用 Django 的 websockets 和异步功能 以便能够在发生实时通知时
  • iPhone - 在应用程序内购买恢复产品提示登录警报两次[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在为非
  • 如何使用 IBM Watson Assistant 显示视频

    我已经使用 IBM Watson Assistant 创建了一个聊天机器人 并且需要加载一些响应的视频 如何将视频嵌入聊天机器人的响应中 您可以使用 HTML 标签将视频嵌入到响应框中 如下所示 请注意 HTML 标签在 试用 面板中不起作
  • C++ 映射的线程同步

    我正在使用 pthread c 98 标准 创建一个多线程 C 程序 我有一个多个线程将访问的 std map 访问将使用 find 添加和删除元素 以及使用 运算符访问元素 我知道使用 运算符进行读取 甚至用它修改元素是线程安全的 但其余
  • 返回 NaN 的数组数组

    那么为什么 myarray bla bl 总是等于 NaN 如果我对一维 myarray bla 做同样的事情 我会得到数字 var bla blabla var bl bla var myarray for i 0 i lt 10 i i
  • 如何对 iPhone 通讯录进行排序?

    我如何以编程方式按名字和姓氏对 iphone 通讯录进行排序 或检索排序数组 任何帮助将不胜感激 谢谢 Call ABAddressBookCopyArrayOfAllPeople 获取地址簿中所有人员记录的数组 然后关注文档 http d
  • django/ajax:无法在views.py中获取Ajax发布数据

    我从 django 后端获取 ajax post 数据时遇到问题 我不知道如何传递该值 请帮忙 在 html 中我只有这样
  • 如何在 Spring 中为 @Service 命名多个名称?

    我需要类似的东西 Named bean1 bean2 Service bean1 bean2 我该怎么做 不是直接的 按照你的方式 但这可以通过重新定义现有的 Service or Component as a Bean无论是一个名字还是一
  • 使用 firebase 部署 React 应用程序时如何隐藏源代码?

    这是我在 stackoverflow 上的第一篇文章 我写信是因为我找不到问题的明确答案 我不知道标题是否正确 但这就是我的意思 情况 我正在使用 React 创建一个单页面应用程序 并打算使用 Node js 和 Express js 构
  • 无法使用 varbinary 更新个人资料图片

    我正在尝试使用 varbinary SQL Server 2008 更新我的个人资料图片 它似乎没有更新我放在文件上传中的图片 下面是我用来更新我的个人资料图片的代码 请帮我看看我的编码的哪一部分做错了 谢谢 protected void
  • 使用 Ninject 2 将参数传递给 WCF ServiceHost 类型

    我想使用 Ninject Wcf 扩展来创建参数化服务主机实例 例如我有一堂课MyWCFHandler仅有以下构造函数 public MyWCFHandler UserManager manager manager manager 但是当我