2

私はここで正しい考えを持っているかどうかを知りたいです。私は主にインターフェースをプログラミングしているので、以下のクラスをDI経由で注入する必要があるのか​​、それとも自分でクラスをインスタンス化する必要があるのか​​を知りたいです...

注:これらのサービスは、Webアプリ(asp.net mvc)ではなくコアライブラリで保持されます

// IUserSessionは不明です。これはクライアントアプリによって異なります。これは不明なので、常に挿入する必要があります。

// IWorkflowServiceクライアントアプリにはいくつかの異なるサービス/パッケージがあるため、ビジネスルールが異なる可能性があるため、注入する必要があります

// IReadonlySessionは私のアプリでは1つしかないので、注入する必要はありませんか?他のクライアント呼び出しでは異なる可能性がありますが、可能性は低いです

// INotificationServiceは常に私が言うことであり、それは常に1つのものになるので、インターフェイスに対してプログラムする必要があり、注入する必要はありませんか?

private readonly IUserSession _userSession;
private readonly IReadOnlySession _readonlySession;
private readonly INotificationService _notificationService;

public Processor(IUserSession userSession, IWorkflowService workflowService)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = new ReadonlySession();
        _notificationService = new NotificationService();
    }

// IReadonlySessionが挿入されます。これは、テストを実行しているかどうか、別のデータベースを使用しているか、別のクライアントアプリからコードを呼び出すかによって変わる可能性があるためです(可能性は低いですが可能です)。

public Processor(IUserSession userSession, IWorkflowService workflowService,   IReadonlySession readonlySession)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = readonlySession;
        _notificationService = new NotificationService();
    }

質問:

オブジェクトのインスタンス化は正しいですか?私がそれを実装した方法は正しいですか?

4

1 に答える 1

3

NotificationServiceとのハードカップリングがまだある場合、インターフェイスに対するプログラミングから得られるものはほとんどないので、

  • INotificationServiceを注入する
  • または具体的なクラスに対するプログラム

適切なデフォルトがいくつかあるように思われるので、コンストラクターチェーンを検討する必要があります。

public Processor(IUserSession userSession, IWorkflowService workflowService)
    : this(userSession, workflowService, new ReadonlySession()) { }

public Processor(IUserSession userSession,
    IWorkflowService workflowService, IReadonlySession readonlySession)
    : base(workflowService)
{
    _userSession = userSession;
    _readonlySession = readonlySession;
    _notificationService = new NotificationService();
}

これにより、ライブラリの利用者は、上級ユーザーを制約することなく、簡単に始めることができます。

ここで概説されているFacadeソリューションを使用することもできます:Dependency Inject(DI)「フレンドリー」ライブラリ

于 2012-01-17T12:32:03.490 に答える