1

MainViewModelからSecondViewModelをインスタンス化しようとしています。これは、IoCContainerに登録されているサービスとMainVMのオブジェクトである2番目のパラメーターを挿入します。

コードはこの種のものです:

class MainViewModel
{
    public MainViewModel()
    {
    }

    private string message = "the message";
    public string Message { get; set; }
}

class SecondViewModel
{
    public SecondViewModel(IService service, string message)
    {
    }
}

これで、IoCコンテナにSecondViewModelFactory(サービスインスタンスを運ぶ)をMainViewModelに注入できるので、それを介してSVMを作成できることがわかりましたが、IServiceの実装が非常に重く、したくない場合はどうなりますか?インスタンス化しますが、本当に必要な場合。

また、同様の方法で他のViewModelをインスタンス化する必要がある場合はどうなりますか?大量のVMFactoriesとコンストラクターのパラメーターを作成する必要がありますか?

また、汎用のViewModelFactoryを使用する場合は、作成されるかどうかに関係なく、すべてのViewModelに必要なすべてのサービスを渡すようにインスタンス化する必要があります。

私の場合のより良い解決策を知っていますか?

4

2 に答える 2

2

一般に、サービスの作成は重くすべきではありません。それらのコンストラクターは、受信した依存関係を格納する以外に何もするべきではありません。バックグラウンドで大量のリソースを使用する場合は、コンストラクターを介してアクセスしないでください。これにより、コンストラクターが単純になり (テストする必要がなくなります)、オブジェクト グラフを非常に迅速に構成できます。

これを回避する方法が本当にない場合は、基本的に 2 つのパターンを適用できます。

1. 工場

ファクトリを注入して、型の作成を遅らせることができます。ファクトリは、明示的に制御する必要があるオブジェクトを作成する場合にも役立ちます (たとえば、できるだけ早く破棄する必要があるインスタンス)。ファクトリを作成するにはいくつかの方法があります。Func<T>サービスにインジェクションや依存関係を好む人もLazy<T>いますが、これは暗黙的すぎると思います。ISomeServiceFactoryこれは読みやすいと思うので、むしろ を挿入します。欠点は、このために新しいインターフェースを定義する必要があることです。ただし、ファクトリ インターフェイスが多数ある場合は、設計に問題がある可能性があります。

2. プロキシ

ファクトリを作成する代わりに、サービスをプロキシの背後に隠すことができます。このプロキシは、サービスと同じインターフェイスを実装でき、遅延実行を行います。IServiceFactoryこれにより、アプリケーションが別のインターフェース (またはなど)に依存することを防ぎますLazy<T>。特にLazy<T>、作成に関する詳細をそのような依存関係の消費者に漏らします。Lazy<T>都合がよければ、このプロキシにa を挿入することもできます。それは問題ではありません。そのプロキシは通常、コンポジション ルートの一部であり、アプリケーションの残りの部分はIServiceLazy<IService>.

ファクトリ、プロキシ、および遅延開始を使用すると、コンテナーの配線が複雑になることに注意してください。したがって、本当に必要であると判断しない限り、if は使用しないでください。それらは間接的であるため、物事を複雑にし、相互に理解することを難しくします。また、自動テストを使用して構成を検証することが難しくなります。コンテナの検証の詳細については、こちらこちらをご覧ください。

于 2012-09-17T10:04:44.690 に答える
1

ほとんどの場合、高価なクラスをすぐに作成することを避けるためIoC Containersに、Lazy 依存関係をサポートしています。Lazy<>

したがって、コードで、高価な IService を遅延させることができます。

class SecondViewModel
{
    public SecondViewModel(Lazy<IService> service, string message)
    {
    }
}

いくつかの一般的な IoC コンテナーを使用して、それらが遅延読み込みをサポートする方法を確認できます: AutofacまたはNInject

于 2012-09-14T13:26:05.097 に答える