12

私はカリバーンマイクロを学んでおり、公式サイトEventAggregatorから活用しようとしています。

ただし、例外があります

「このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。」

メッセージ自体は明確ですが、例にはパラメーターなしのコンストラクターも含まれていません。1つ追加すると、パラメーターを持つコンストラクターはヒットせず、IEventAggregatorまだ正しく注入されません。

パラメーターなしのコンストラクターを追加した後のパブリッシャー VM を次に示します (それがないと、例外がスローされます)。

    public MainViewModel() { }

    public MainViewModel(IEventAggregator ea) : this()
    {
        eventAggregator = ea;
    }

そして、ここに私が使用しているブートストラップがあります:

public class AppBootstrapper : Bootstrapper<MainViewModel>
{
    private readonly SimpleContainer container = new SimpleContainer();

    protected override void Configure()
    {
        container.Singleton<IEventAggregator, EventAggregator>();
    }
}

CM の例を次に示します。

// Creating the EventAggregator as a singleton.
public class Bootstrapper : BootstrapperBase {
    private readonly SimpleContainer _container =
        new SimpleContainer();

     // ... Other Bootstrapper Config

    protected override void Configure(){
        _container.Singleton<IEventAggregator, EventAggregator>();
    }

    // ... Other Bootstrapper Config
}

// Acquiring the EventAggregator in a viewModel.
public class FooViewModel {
    private readonly IEventAggregator _eventAggregator;

    public FooViewModel(IEventAggregator eventAggregator) {
        _eventAggregator = eventAggregator;
    }
}

私はこの投稿(Caliburn Microを使用してEventAggregatorをViewModelに注入する)を確認しましたが、CMがインジェクションでコンストラクターを呼び出さない理由は何も述べていません。

CMのサンプル溶液も確認しましたが、DI溶液としてMEFを使用しています。

何が恋しいですか?

4

2 に答える 2

9
// ... Other Bootstrapper Config

重要なのは、他のブートストラップ設定です。

最適なオプションは、Caliburn.Micro.Start NuGet パッケージを介して Caliburn.Micro をインストールし、Caliburn.Micro が提供する も使用するSimpleContainer提供されたブートストラップを確認することです。

これが完全です:

public class AppBootstrapper : BootstrapperBase
{
     SimpleContainer container;

     public AppBootstrapper()
     {
         Start();
     }

     protected override void Configure()
     {  
         container = new SimpleContainer();
         container.Singleton<IWindowManager, WindowManager>();
         container.Singleton<IEventAggregator, EventAggregator>();
         container.PerRequest<IShell, ShellViewModel>();
     }

     protected override object GetInstance(Type service, string key)
     {
         var instance = container.GetInstance(service, key);
         if (instance != null)
             return instance;
         throw new InvalidOperationException("Could not locate any instances.");
     }

     protected override IEnumerable<object> GetAllInstances(Type service)
     {
         return container.GetAllInstances(service);
     }

     protected override void BuildUp(object instance)
     {
         container.BuildUp(instance);
     }

     protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
     {
         DisplayRootViewFor<IShell>();
     }
}
于 2013-07-23T07:58:24.500 に答える