1

我正在使用 GUI 模式(一个项目)和控制台模式(另一个项目)构建一个 .NET 解决方案。这些项目中的每一个都引用了一个共享类库,该类库包含每个应用程序背后的共享逻辑内容。我希望 DLL 尽可能与每个客户端应用程序隔离。如何让 DLL 向 gui 报告进度?现在,GUI 项目引用了 DLL。VS2010 / .NET 不允许我从 DLL 中引用 GUI,因为这将是一个循环引用。

我怎样才能做到这一点?在 .NET 设计或软件设计中如何处理这个问题有什么一般原则吗?有没有办法在不引用调用项目的情况下使用回调?

4

3 回答 3

1

打破循环引用的最简单方法是创建两个模块都引用的另一个库。

另一种选择是使用可以由逻辑 DLL 引发并在 gui/console 部分中处理的事件

于 2012-05-10T15:17:48.627 回答
1

在我看来,您需要在您的 DLL 中添加一个自定义事件,然后将其附加到您的 GUI 中。

这里有一些代码使它更容易理解。

首先让我们创建一个 DLL 的模拟,它执行类似于加载的操作,还定义了一个我们可以在我们的 GUI 中附加到接收完成百分比的事件:

public class MyDLLType
{
  public decimal PercentageComplete = 5;

  public event EventHandler<CustomEventArgs> StatusChanged;

  public virtual void OnStatusChanged(CustomEventArgs e)
  {
   if(StatusChanged != null)
   {
      StatusChanged(this, e);
   }
  }

  public void DoSomething()
  {

     var eventArgs = new CustomEventArgs();
     eventArgs.PercentageComplete = PercentageComplete;

     OnStatusChanged(eventArgs);

     if(PercentageComplete < 100)
     {
       Thread.Sleep(500);
       PercentageComplete++;
       DoSomething();
     }
  }
}

现在我们有了一个模拟 DLL,它StatusChanged为我们的 GUI 提供了一个要挂钩的事件。这是一个利用这一点的模拟 GUI:

public class MyGUI
{
void Main()
{
    var myNiceDLLType = new MyDLLType();
    myNiceDLLType.StatusChanged += UpdateStatusChange;
    myNiceDLLType.DoSomething();
}

public void UpdateStatusChange(object sender, CustomEventArgs e)
{
 var percentageComplete = e.PercentageComplete;
 Console.WriteLine(percentageComplete);
}
}

和宾果游戏,我们的 GUI 正在从 DLL 接收完整的百分比,而 DLL 不需要了解有关 GUI 的任何信息。

我在上面使用的 CustomEventArgs 如下所示:

public class CustomEventArgs : EventArgs
{
    public decimal PercentageComplete{get;set;}
}
于 2012-05-10T15:54:58.430 回答
0

如果设计是这样的,它需要循环引用,恕我直言,您应该在必要的地方重新设计那部分代码。

我建议将相关代码放到codereview.stackexchange.com

于 2012-05-10T15:12:18.573 回答