相关疑难解决方法(0)

单身人士有什么不好的?

单例模式是一个缴足成员四人帮模式书,但最近似乎而是由开发者世界孤立.我仍然使用相当多的单例,特别是对于工厂类,虽然你必须对多线程问题(实际上是任何类)有点小心,但我不明白为什么它们如此可怕.

Stack Overflow特别假设每个人都同意Singletons是邪恶的.为什么?

请用" 事实,参考或特定专业知识 " 支持您的答案

singleton design-patterns

1931
推荐指数
30
解决办法
48万
查看次数

有没有办法只在C#中设置一次属性

我正在寻找一种方法来允许C#对象中的属性只设置一次.编写代码很容易,但我宁愿使用标准机制(如果存在).

public OneShot<int> SetOnceProperty { get; set; }

我想要发生的是,如果属性尚未设置,则可以设置属性,但如果之前已设置,则抛出异常.它应该像Nullable值一样运行,我可以检查它是否已设置.

.net c#

63
推荐指数
5
解决办法
3万
查看次数

WCF服务可以有构造函数吗?

当我在我的解决方案中新建一个WCF服务时,我可以执行以下操作,有一个带参数的构造函数来传入吗?如果是,运行时如何,何时以及在何处填写我所需的IBusinessLogic对象?

[ServiceContract]
public interface IServiceContract
{
    [OperationContract]
    ...
}

public class MyService : IServiceContract
{
    IBusinessLogic _businessLogic;
    public ServiceLayer(IBusinessLogic businessLogic)
    {
        _businessLogic = businessLogic;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

wcf constructor dependency-injection

41
推荐指数
3
解决办法
4万
查看次数

WCF自定义行为的依赖注入

在我的WCF服务中,我有一个自定义消息检查器,用于将传入消息验证为XML Schema的原始XML.消息检查器具有一些依赖性(例如记录器和XML架构集合).我的问题是,我可以使用依赖注入框架(我目前正在使用Ninject)来实例化这些自定义行为并自动注入依赖项吗?

我做了一个简单的例子来展示这个概念:

using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using Ninject.Extensions.Logging;

public class LogMessageInspector : IDispatchMessageInspector
{
    private readonly ILogger log;

    public LogMessageInspector(ILogger log)
    {
        this.log = log;
    }

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        LogMessage(ref request);
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        LogMessage(ref reply);
    }

    private void LogMessage(ref Message message)
    {
        //... copy the message and log using this.log ...
    }
}

public class LogMessageBehavior : IEndpointBehavior
{
    private readonly …
Run Code Online (Sandbox Code Playgroud)

c# wcf dependency-injection ninject

13
推荐指数
1
解决办法
4410
查看次数

使用WCF向客户端触发事件

我知道有关于WCF回调和事件的教程,但是我无法让它们实际工作,或者它们太复杂了.我是一个真正的初学者,所以我很想听听是否有人知道任何可靠的初学者教程,这些教程的目标是我现在想要具体解决的问题.如果我使用错误的术语(请纠正我),请原谅我,就像我说我是初学者一样.

问题:

在此输入图像描述

它可能看起来比实际上更复杂.基本上我想要完成的是:

  1. 具有一些本地内存的主机(比如一个包含5个整数的数组)并运行WCF服务.这将从客户端侦听查询并在更改其中一个整数时从客户端激发更新(事件?)(从外部源,例如通过命令提示符和Set()的用户输入).
  2. 可以进行直接查询以返回这五个整数之一或订阅主机数组的特定索引的客户端.

我可以做什么:

我可以设置连接,但我的服务仅限于独立功能.客户端可以进行"查询",但仅限于远程函数调用(例如"add",其中所有参数都随函数传递,处理在内部完成).

我想弄清楚的是:

  1. 如何从服务合同函数中访问主机内存中保存的一些变量?例如,如何从客户端GetInt()调用一个方法,该方法只返回存储在主机上的应用程序内存中的内容?
  2. 如何从主机向客户端发送"消息"?例如,在主机中,调用TellClient(int x),它会在客户端调用某些函数?如果不在双方都运行服务,这可能吗?

TLDR:

主持人:服务< - >客户端.有没有办法将数据(只是一个int)推送到客户端而无需客户端调用任何函数(没有轮询或查询)?有没有办法让WCF服务访问变量存储在主机应用程序的实例中而不使用静态成员?这可以通过简单的方式完成吗?

谢谢你的帮助和时间,我知道我写了一本书. 如果有人知道任何好的教程,请指出他们. 但请不要 - 请不要指向Add(int x,int y)示例,其中客户端只在主机上调用add并返回结果 - 我已经完成了几次这样做并且它没有帮助我掌握WCF的真正功能.我真的不想在这一点上做任何严肃的事情,我真的想保持简单,所以我可以学习WCF可以做什么,而且我没有发现文档非常有用.再次感谢大家.

c# wcf

8
推荐指数
1
解决办法
4990
查看次数

如何将参数传递给ServiceHost

我正在做以下事情

 //Define the service host
        this._smeediPluginServiceHost = new ServiceHost(typeof(SmeediServiceHost), smeediServiceUri);
        this._smeediPluginServiceHost.AddServiceEndpoint(typeof(ISmeediServiceHost), GetBinding(), smeediServiceUri);
        SetupAndStartWebService(_smeediPluginServiceHost); 


  private void SetupAndStartWebService(ServiceHost serviceHost, ServiceDiscoveryBehavior serviceDiscoveryBehavior = null)
    {
        //Define service behaviours
        ServiceMetadataBehavior serviceMetadataBehavior = new ServiceMetadataBehavior();
        serviceMetadataBehavior.HttpGetEnabled = true;

        //Add the behaviours to the service
        serviceHost.Description.Behaviors.Add(serviceMetadataBehavior);

        if (serviceDiscoveryBehavior != null)
            serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior);

        serviceHost.Open();
    }  
Run Code Online (Sandbox Code Playgroud)

我需要将一个参数传递给服务,我无法弄清楚如何.我看过如何将值传递给我的wcf服务上的构造函数?但无法理解我的想法.谢谢

parameters service wcf servicehost

7
推荐指数
1
解决办法
1万
查看次数

Windler IOC在非Http WCF应用程序中 - 初始化IOC内核时出错

我在尝试在WCF应用程序中初始化我的IOC容器时遇到问题.该应用程序是基于非HTTP的使用WAS.

当我启动应用程序时,我收到此错误消息...

Kernel was null, did you forgot to call DefaultServiceHostFactory.RegisterContainer

我已经看到了这个解决方案的其他答案,它说要做以下事情......

  • 将工厂定义添加到ServiceHost定义,例如

Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration"

  • 使用名为AppInitialize()的静态方法在App_Code文件夹中创建一个类.然后应该自动调用此方法,您可以使用它来注册容器.

我已经这样做但我的AppInitialize方法没有被调用,我仍然得到上面的错误.

谢谢.

wcf castle-windsor was ioc-container inversion-of-control

5
推荐指数
0
解决办法
786
查看次数

具有 DI 和 InstanceContextMode.Percall 的自定义 ServiceHost

在我的托管应用程序中,我当前的 WCF 服务运行为:

SomeService service = new SomeService(container) //IUnityContainer
ServiceHost serviceHost = new ServiceHost(service, serviceAddress);
Run Code Online (Sandbox Code Playgroud)

有什么问题吗?SomeService 定义为:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single
Run Code Online (Sandbox Code Playgroud)

这不再好了,我需要将其设为InstanceContextMode.PerCall

当尝试 .Open() 时,如果将 InstanceContextMode 更改为“PerCall” - 它将抛出:

System.InvalidOperationException: In order to use one of the ServiceHost constructors that takes a service instance, the InstanceContextMode of the service must be set to InstanceContextMode.Single.  This can be configured via the ServiceBehaviorAttribute.  Otherwise, please consider using the ServiceHost constructors that take a Type argument
Run Code Online (Sandbox Code Playgroud)

这是我的问题的解决方案吗?如何将值传递给 wcf 服务上的构造函数?

我主要关心的是:
我在这个托管应用程序中运行不同类型的服务,似乎只有当我运行一种类型的服务时,这个解决方案才是好的。

c# wcf servicehost

5
推荐指数
1
解决办法
2625
查看次数

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

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

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

public MyWCFHandler(UserManager manager)
{
  _manager = manager;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我决定采用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. 将使用新ServiceModule()初始化的内核添加到KernelContainer.

  4. 像这样使用NinjectServiceHost:

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

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

问题是:

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

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

c# wcf ninject

3
推荐指数
1
解决办法
5064
查看次数