检查是否从Windows Forms应用程序调用代码

时间:2016-02-12 12:08:56

标签: c# winforms web-services

我有一个类库,可以从Web服务,服务或Windows窗体应用程序调用。

对于Windows窗体应用程序,我想显示web服务的是/否消息框以及我想假设的服务。

我知道我可以重构我的代码以使用抽象层,例如

var provider = new MessageBoxProvider(); // Or other implementation
var result = provider.QueryResult(...);

但除此之外:

有没有更好的方法来检查是否从Windows应用程序调用代码?目前我在做

System.Windows.Forms.Application.OpenForms.Count > 0

4 个答案:

答案 0 :(得分:2)

我使用System.Environment.UserInteractive进行此类检查。

如果我没错,这对于Windows应用程序返回true,对于Windows服务,Web应用程序和Web服务则返回false。 (控制台应用程序怎么样?我应该检查)

我同意你应该以不同的方式解决问题,正如其他人指出的那样

答案 1 :(得分:1)

我宁愿使用依赖注入,你可以将带有方法的接口传递给类,因此它也可以在单元测试中进行测试,并且可以从Windows Forms应用程序进行设置,而不依赖于该类中的Windows Forms内容。我猜这就像你的抽象层。

public interface IMessageHandler
{
    void SendMessage(string message);
}

public class WindowsFormsMessageHandler : IMessageHandler
{
    public void SendMessage(string message)
    {
        System.Windows.Forms.MessageBox.Show(message);
    }
}

public class OuterClass
{
    private IMessageHandler _handler;

    public OuterClass(IMessageHandler handler)
    {
        if (handler == null)
            throw new ArgumentNullException("handler");

        _handler = handler;
    }

    public void DoSomething()
    {
        _handler.SendMessage("Hello");
    }    
}

...

var testClassInWindowsForms = new OuterClass(new WindowsFormsMessageHandler());

test.DoSomething();

通过这样做,你可以根据你来自哪里来改变行为,而不是依赖可能不可靠的检查。

答案 2 :(得分:0)

您可以将bool传递给类库,例如:

new ClassLibrary(true);

当它是WinForms应用时。

然后让构造函数类似于以下

ClassLibrary(bool calledFromWinforms)

我知道这不是最好的代码,但它使事情变得简单并且不会使它们过于复杂。

答案 3 :(得分:0)

我的方法是向类中添加一个属性,该类在实例化时设置自身并存储其运行的环境类型。稍后可以使用该属性来识别它的调用位置。