在我们的棱镜应用程序中,当用户单击树中的项目(单独的模块)时,我们需要将模块加载到中心窗格。中心窗格中的模块(例如设计器模块)可以打开文件并在给定路径时显示自己。如何将文件路径传递给该模块? 例如
在Designer模块中
public DesignerViewModel(DataAccess dataAccess)// This will be injected
{
}
//The following class can create the model objects using the IDataService for getting data from remote location
public DataAccess(IDataService service)//this will be injected
{
}
数据访问对象是Designer模块的本地对象,所以我不想将它暴露给模块外部。因此,注册在模块中完成
public class DesignerModule : IModule
{
public void Initialize()
{
var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
container.RegisterType<Object, DesignerView>("DesignerUI");
container.RegisterType<DataAccess>();
}
}
IDataService已在应用程序级别注册
public class BootStrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType<IDataService, DataService>();
}
}
请注意,IDataService是整个应用的单身人士。我无法传递特定于IDataService中的模块实例的文件路径。请注意,您可以根据需要在中心窗格中打开任意数量的模块,只需单击树项目 - >树将触发具有所选项目ID的事件 - &gt;应用程序将找到与项目ID对应的路径并调用该模块。
当我说_regionManager.AddToRegion(“CenterRegion”,DesignerModule)时,我将如何传递路径; Prism会很好地完成所有依赖注入,但是如何通过这条道路是个大问题?
答案 0 :(得分:0)
您可以使用EventAggregator与beetwen模块进行交换。 每个模块都订阅EventAggregator。 当您打开模块时,您可以发送有关新生儿的主机控制通知。 主机控制使用初始化数据发回响应。
public class MessageEvent : CompositePresentationEvent<Message>{}
internal class MessageReceiver
{
private readonly MessageEvent _evt;
private readonly string _myId = Guid.NewGuid().ToString();
internal MessageReceiver(IEventAggregator eventAggregator)
{
_evt = eventAggregator.GetEvent<MessageEvent>();
_evt.Subscribe(Receive, true);
_evt.Publish(new Message { Source = _myId, Command = Message.Commands.WhoIAm });
}
public void Receive(Message message)
{
switch (message.Command)
{
case Message.Commands.WhoIAm:
_evt.Publish(
new Message
{
Destination = message.Source,
Command = Message.Commands.Initialize,
MessageData = Encoding.UTF8.GetBytes("init data")
});
break;
case Message.Commands.Initialize:
if (message.Destination == _myId)
{
//init
}
break;
}
}
}
public class Message
{
public enum Commands { Initialize, WhoIAm }
public string Source { get; set; }
public string Destination { get; set; }
public Commands Command { get; set; }
public byte[] MessageData { get; set; }
}
答案 1 :(得分:0)
我找到了同事的答案。调用Resolve()时,可以使用自己的对象覆盖参数。因此,创建将要注入的对象,填充它并使用ParameterOverride与Resolve&lt;&gt;()一起传递。在谷歌搜索ParameterOverride以获取更多信息。