项目之间的互动

Nao*_*aor 5 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

该接口有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);   
    }   
    
    Run Code Online (Sandbox Code Playgroud)

现在,它是这样的:

  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的实现.

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

Kie*_*one 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这是中介者模式的一个简单但相当糟糕的实现:

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

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