2011-11-07 5 views
0

私たちのプリズムアプリケーションでは、ユーザーがツリー内のアイテム(別個のモジュール)をクリックすると、中央ペインにモジュールをロードする必要があります。中央ペインのモジュール(デザイナーモジュールなど)はファイルを開き、パスが与えられていればそれ自身を表示することができます。ファイルのパスをこのモジュールに渡すにはどうすればよいですか?デザイナモジュールの例プリズムで同期メッセージを渡す

について

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 
{ 
} 

データアクセスオブジェクトは、デザイナモジュールに対してローカルであるので、私は、モジュール外部に公開したいwouldntの。そう登録は

public class DesignerModule : IModule 
{ 
     public void Initialize() 
     { 
      var container = ServiceLocator.Current.GetInstance<IUnityContainer>(); 
      container.RegisterType<Object, DesignerView>("DesignerUI"); 
      container.RegisterType<DataAccess>();    
     } 
    } 

IDataServiceは、アプリケーションレベルIDataService全体アプリのシングルトンであること

public class BootStrapper : UnityBootstrapper 
    { 
     protected override void ConfigureContainer() 
     { 
      base.ConfigureContainer(); 
      Container.RegisterType<IDataService, DataService>(); 
     } 
    } 

注に登録されたモジュールで行われます。 IDataServiceのモジュールインスタンスに固有のファイルのパスを渡すことができません。あなたが好きなように中央のペインに任意の数のモジュールを開くことができることに注意してください、ツリーアイテムをクリックする - >ツリーは、選択されたアイテムid-> appを使ってイベントを発生させ、アイテムIDに対応するパスを見つけ、モジュール

_regionManager.AddToRegion( "CenterRegion"、DesignerModule);と言うと、パスをどのように渡しますか。プリズムはすべての依存性注射を美しく行いますが、その道をどのように通すのが大きな問題ですか?

答えて

0

解決方法()を呼び出すと、自分のオブジェクトでパラメータをオーバーライドすることができます。それで、注入しようとしているオブジェクトを作成し、そこに移入して、ParameterOverrideでResolve <>()を渡します。詳細については、GoogleのParameterOverrideを検索してください。

0

EventAggregatorを使用すると、他のモジュールとメッセージを交換できます。 各モジュールは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; } 
} 
+0

@ Radik-これは私が欲しいものではありません。モジュールの作成自体は、パス情報を含むツリーモジュールからのイベントのためです。このイベントはメインアプリケーションによって処理され、mainappはアプリケーションの中央ペインにDesigner Moduleを作成します。モジュールインスタンスの作成時点でパス情報を渡すことをお勧めします。 – Jimmy

関連する問題