2011-08-09 64 views
5

我有两个项目。 ProjectA有一个名为Task的类,projectB有一个名为Transmission的类。我希望每当传输发生变化时 - 任务会发生在任务和每当任务发生变化时 - 传输中会发生一些事情。项目之间的交互

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

在通用项目中,我创建了ProjectA将实现的名为IManager的接口。管理器的角色是处理更新。界面看起来像这样:

public interface IManager 
{ 
    ITaskChangedHandler TaskChangedHandler { set; } 

    void OnTransmissionChanged(ITransmissionWithTasks transmission); 
} 

这个接口有2种方法项目A必须实现:

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); 当在传输(内部项目B)的变化调用此方法,以更新任务。

  2. ITaskChangedHandler TaskChangedHandler { set; } IManager实现必须具有setas到ITaskChangedHandler。 ITaskChangedHandler是规定任务的情况下,用于更新传输的方法的接口改变:

    public interface ITaskChangedHandler 
    { 
        void OnTaskChanged(string moduleName, ITask task, long transmissionId); 
    } 
    

现在,它是这样的:

  1. 项目A具有执行到iManager。

  2. 每当有一个传输的cahnge我用StructureMap接受iManager中执行的实例,然后调用OnTransmissionChanged();

  3. 这是我的问题 - 每当有在任务(在项目A)的变化,我想调用IManager实现的TaskChangedHandler.OnTaskChanged()。但问题是IManager实现的实例没有设置TaskChangedHandler。
    我也不知道我应该在哪里设置这个TaskChangedHandler:

    • 这不可能是在项目A,因为它不知道ITaskChangedHandler的实施。

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

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

任何人可以帮助我解决这个问题?

回答

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()相应。

这是一个简单的,和相当差,执行调解模式:

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

依赖注入,你可以得到一个实例基于共享接口上的对象了。例如,对于Ninject,您可以注册IFirst的处理程序为常量(实现IFirst的某些特定实例),反之亦然。然后拨打Get<IFirst>来抓住它。

+1

你认为什么更好 - 使用静态(或非静态)中介或者两种方式都使用依赖注入? – Naor

+0

经过第二次考虑 - 此中介必须是静态的。每个项目都应该注册这些事件,如果它不是静态的,将不会有实例注册。我对吗? – Naor

+1

如果你通过依赖注入来使用单例,那么没有必要是静态的,你可以'Get '(例如)并返回相同的实例。在我看来,静态是相当丑陋的。调解员必须在使用它之前注册自己。也就是说,您不需要使用DI的中介,因为任务可以将自己注册为ITask实现,将传输视为IT传输,并且都可以使用DI访问彼此。 –