检查是否从 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
我使用 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)
我知道这不是最好的代码,但它使事情变得简单并且不会使它们过于复杂。
我的方法是向类添加一个属性,该属性在实例化时设置自身并存储其运行的环境类型。比属性稍后可用于标识从何处调用它。