项目之间的互动

时间:2011-08-09 12:19:49

标签: c# .net design-patterns

我有两个项目。 ProjectA有一个名为Task的类,projectB有一个名为Transmission的类。我希望每当Transmission发生变化时 - 在Task中会发生一些事情,每当Task发生变化时 - 在Transmission中都会发生一些事情。

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

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

public interface IManager
{
    ITaskChangedHandler TaskChangedHandler { set; }

    void OnTransmissionChanged(ITransmissionWithTasks transmission);
}

此接口有ProjectA必须实现的两种方法:

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); 当传输发生变化时(在ProjectB内),调用此方法以便在任务中进行更新。

  2. ITaskChangedHandler TaskChangedHandler { set; } IManager实现必须具有ITaskChangedHandler的设置器。 ITaskChangedHandler是一个接口,它定义了更改任务时更新传输的方法:

    public interface ITaskChangedHandler   
    {   
        void OnTaskChanged(string moduleName, ITask task, long transmissionId);   
    }   
    
  3. 现在,它是这样的:

    1. ProjectA已实现IManager。

    2. 每当传输中出现cahnge时,我都会使用StructureMap接收IManager实现的实例,然后调用OnTransmissionChanged();

    3. 这是我的问题 - 每当Task(在ProjectA中)发生变化时,我都想调用IManager实现的TaskChangedHandler.OnTaskChanged()。但问题是IManager实现的实例没有设置TaskChangedHandler 我也不知道我应该在哪里设置这个TaskChangedHandler:

      • 这不能在ProjectA中,因为它不知道ITaskChangedHandler的实现。

      • 这不能在ProjectB中,因为IManager实现的创建发生在ProjectA中,因此该集必须在projectA中。

      • 这不能在Common项目中,因为它不知道IManager和ITaskChangedHandler的实现。

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

1 个答案:

答案 0 :(得分:2)

这是一个快速而肮脏的方法,可能会让您思考:一个静态的共享类,您可以在共享程序集中定义。

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

通过依赖注入,您也可以基于共享接口获取对象的实例。例如,使用Ninject,您可以将IFirst的处理程序注册为常量(实现IFirst的某些特定实例),反之亦然。然后致电Get<IFirst>抓住它。