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

本文关键字:应用程序 调用 代码 窗体 Windows 是否 检查 | 更新日期: 2023-09-27 18:34:24

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

对于 Windows 窗体应用程序,我想为 Web 服务和我只想假设是的服务显示是/否消息框。

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

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

但除此之外:

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

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

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

我使用 System.Environment.UserInteractive 进行这种检查。

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

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

我宁愿使用依赖关系注入,将带有该方法的接口传递给类,因此也可以在单元测试中对其进行测试,并从 Windows 窗体应用程序进行设置,而无需依赖该类中的 Windows 窗体内容。我想这就像你的抽象层。

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();

通过这样做,您可以根据您来自的位置根据实现来更改行为,而不依赖于可能不可靠的检查。

您可以将布尔值传递给类库,例如:

new ClassLibrary(true);

当它是一个WinForms应用程序时。

然后具有类似于以下内容的构造函数

ClassLibrary(bool calledFromWinforms)

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

我的方法是向类添加一个属性,该属性在实例化时设置自身并存储其运行的环境类型。比属性稍后可用于标识从何处调用它。