我有两个项目。 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必须实现的两种方法:
void OnTransmissionChanged(ITransmissionWithTasks transmission);
当传输发生变化时(在ProjectB内),调用此方法以便在任务中进行更新。
ITaskChangedHandler TaskChangedHandler { set; }
IManager实现必须具有ITaskChangedHandler的设置器。 ITaskChangedHandler是一个接口,它定义了更改任务时更新传输的方法:
public interface ITaskChangedHandler
{
void OnTaskChanged(string moduleName, ITask task, long transmissionId);
}
现在,它是这样的:
ProjectA已实现IManager。
每当传输中出现cahnge时,我都会使用StructureMap接收IManager实现的实例,然后调用OnTransmissionChanged();
这是我的问题 - 每当Task(在ProjectA中)发生变化时,我都想调用IManager实现的TaskChangedHandler.OnTaskChanged()
。但问题是IManager实现的实例没有设置TaskChangedHandler
我也不知道我应该在哪里设置这个TaskChangedHandler:
这不能在ProjectA中,因为它不知道ITaskChangedHandler的实现。
这不能在ProjectB中,因为IManager实现的创建发生在ProjectA中,因此该集必须在projectA中。
这不能在Common项目中,因为它不知道IManager和ITaskChangedHandler的实现。
有人可以帮我解决这个问题吗?
答案 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>
抓住它。