1

ばかげた質問かもしれませんが、私はそれにこだわっています。

アプリケーション全体で SimpleContainer を IoC として使用しようとしているので、データ アクセス レイヤーで次のようにブートストラップを定義しました。

    public class AppBootstrapper : BootstrapperBase 
    {
        SimpleContainer container;

        public AppBootstrapper()
        {
            Start();
        }

        protected override void Configure()
        {
            container = new SimpleContainer();
            container.PerRequest<IMyClass, MyClass>();
        }

        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.");
        }

しかし、どうすればそれを使用できますか?

私は単に実装を取得して書きたいと思っています:

IMyClass mc = new IoC.GetInstance(IMyClass );

しかし、私は方法を見つけられませんでした

私はもう試した:

SimpleContainer container = new SimpleContainer();
IMyClass mc = new container.GetInstance(IMyClass,null);

と:

IMyClass mc = new IoC.GetInstance(IMyClass, null);

しかし、どれも機能しません。

どうしたの?

編集:

そして、すべてのプロジェクトに 1 つの AppBootstrapper.cs がある場合、すべてうまく機能しますか、それともベスト プラクティスが異なりますか?

4

1 に答える 1

10
IMyClass mc = new IoC.GetInstance(IMyClass );

IoCはクラスであるためstatic、新しいインスタンスを作成することはできませんが、代わりに次のようにすることができます。

IMyClass mc = IoC.Get<IMyClass>();

それにもかかわらず、これも推奨される方法ではありません。

そのようにブートストラップを初期化した後、次のようなものがあるとしましょうSellViewModel:

public class ShellViewModel {

    private IMyClass _mc;

    public ShellViewModel(IMyClass mc) {
        _mc = mc;
    }
}

Caliburn.Micro が をインスタンス化しようとするShellViewModelと、コンストラクターが のインスタンスを受け入れることIMyClassがわかり、そのクラスのインスタンスが自動的に作成され、 に提供されますShellViewModel

Dependency InversionInversion of Controlについて読んでから、クラスのドキュメントをSimpleContainer読んでから、記事Screens, Conductors and Compositionを読んでプロセス全体の感覚をつかむことをお勧めします。

于 2013-10-14T16:15:26.930 に答える