我有一个类库,可以从Web服务,服务或Windows窗体应用程序调用。
对于Windows窗体应用程序,我想显示web服务的是/否消息框以及我想假设的服务。
我知道我可以重构我的代码以使用抽象层,例如
var provider = new MessageBoxProvider(); // Or other implementation
var result = provider.QueryResult(...);
但除此之外:
有没有更好的方法来检查是否从Windows应用程序调用代码?目前我在做
System.Windows.Forms.Application.OpenForms.Count > 0
答案 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)
我的方法是向类中添加一个属性,该类在实例化时设置自身并存储其运行的环境类型。稍后可以使用该属性来识别它的调用位置。