我有两个项目。 ProjectA有一个名为Task的类,而ProjectB有一个名为Transmission的类。我希望每当传输发生更改时-Task中将发生某些事情,而每当Task发生更改时-传输中都会发生一些事情。

为此,我创建了另一个名为Common的项目,ProjectA和projectB都将引用该项目。通常,我将所有接口(interface)都放在两个实体之间进行交互。

在Common项目中,我创建了一个名为IManager的接口(interface),ProjectA将实现该接口(interface)。 Manager的作用是处理更新。界面如下所示:

public interface IManager
{
    ITaskChangedHandler TaskChangedHandler { set; }

    void OnTransmissionChanged(ITransmissionWithTasks transmission);
}

此接口(interface)有2种方法ProjectA必须实现:
  • void OnTransmissionChanged(ITransmissionWithTasks transmission);当传输发生变化时(在ProjectB内部),将调用此方法以更新任务。
  • ITaskChangedHandler TaskChangedHandler { set; }IManager实现必须具有ITaskChangedHandler的 setter 。 ITaskChangedHandler是一个接口(interface),该接口(interface)定义了在任务更改的情况下用于更新传输的方法:
    public interface ITaskChangedHandler
    {
        void OnTaskChanged(string moduleName, ITask task, long transmissionId);
    }
    

  • 现在,它是这样的:
  • ProjectA具有IManager的实现。
  • 每当传输中发生错误时,我都会使用StructureMap接收IManager实现的实例,然后调用OnTransmissionChanged();
  • 这是我的问题-每当Task(在ProjectA中)发生更改时,我都希望调用IManager实现的TaskChangedHandler.OnTaskChanged()。但是问题是IManager实现的实例未设置TaskChangedHandler。
    我也不知道该在哪里设置TaskChangedHandler:
  • 这不能在ProjectA中,因为它不知道ITaskChangedHandler的实现。
  • 这不能在ProjectB中,因为IManager实现的创建发生在ProjectA中,因此该集必须在projectA中。
  • 这不能在Common项目中,因为它不知道IManager和ITaskChangedHandler的实现。

  • 有人可以帮我解决这个问题吗?

    最佳答案

    这是一种让您思考的快捷方法:可以在共享程序集中定义的静态共享类。

    public static class SharedEvents
    {
        public delegate void FirstEventHandler();
        public delegate void SecondEventHandler();
    
        public static event FirstEventHandler FirstEvent;
        public static event FirstEventHandler SecondEvent;
    
        public static void OnFirstEvent()
        {
            if (FirstEvent != null) FirstEvent();
        }
    
        public static void OnSecondEvent()
        {
            if (!SecondEvent != null) SecondEvent();
        }
    }
    

    一个注册处理FirstEvent,另一个注册处理SecondEvent:互相调用,相应地调用OnFirstEvent()OnSecondEvent()

    这是Mediator模式的简单但效果很差的实现:

    http://en.wikipedia.org/wiki/Mediator_pattern

    使用依赖注入(inject),您也可以基于共享接口(interface)将对象实例化。例如,使用Ninject,您可以将IFirst的处理程序注册为常量(实现IFirst的特定实例),反之亦然。然后调用Get<IFirst>进行抓取。

    关于c# - 项目之间的互动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6996107/

    10-10 13:46