4

私は最近、インターフェイスを で修飾してデフォルトの実装を指定することにより、C# でインターフェイスを「新しく」できることを発見しました。CoClassAttribute

[ComImport, Guid("579A4F68-4E51-479A-A7AA-A4DDC4031F3F"), CoClass(typeof(FooImpl))]
public interface IFoo
{
    void Bar();
}

public class FooImpl : IFoo
{
    public void Bar() { }
}

...

// Constructs a FooImpl
IFoo foo = new IFoo();

この機能が主に COM 相互運用機能をサポートするために存在することは承知していますが、これが汎用クラス ライブラリの既定の実装にインターフェイスを関連付ける合理的な方法であるかどうか疑問に思っていました。

2 つの質問があります。

  1. これを行う際に落とし穴はありますか?私は COM 相互運用の専門家ではないので、これが POCO に悪影響を与えるかどうかはわかりません。私は主要なテストを実行していませんが、私の例の IL は問題ないようです ( andの呼び出しではなく、通常のnewobj命令です)。FooImplType.GetTypeFromCLSIDActivator.CreateInstance

  2. これがスムーズに機能する場合でも、これを回避する他の理由 (API 設計の観点から言う) はありますか?

4

2 に答える 2

2

これを行うべきではない主な理由は、COMライフサイクル管理を必要としないオブジェクトのインスタンスで開始していることです。.NETは、セキュリティスタックウォーク、アパートのスレッドチェック、addref/releaseなどのCOM相互運用機能を実行する必要があります。

代わりに、依存性注入(制御パターンの反転)とCommonServiceLocatorパターンを検討することを検討します。コンストラクターインジェクションは依存関係管理に適したパターンであるため、コンストラクターインジェクションの理解に焦点を当てます。

これが私のライブラリで行っていることです。ロギングサービスを作成したいとします(考案された例)。2つのコアコンポーネントがあります。

MyStuff.Logging.Contracts-ここでILoggerインターフェイスを宣言しますMyStuff.Logging-ここで、FileLogger、DatabaseLoggerなどのさまざまなロギング実装を記述します。

次に、私のアプリケーションでは、NinjectまたはUnity(DIコンテナー)のいずれかを使用して、ILoggerをデフォルトの実装に関連付けます。

于 2011-11-11T17:38:20.627 に答える
-2

インテリセンス コメントを使用します。

    /// <summary>
    /// Explain here all about interface
    /// </summary>

属性をハッキングするのではなく、クラスを使用する他の誰かの半反射実装で裏目に出る可能性があるためです。属性はリフレクションを使用するツールで使用するためにあり、intelisense はドキュメント用です。

確かに、レガシー ツールの中には /// コメントの読み取りに問題があるものもありますが、属性も読み取ることができません。

于 2011-11-11T13:12:18.783 に答える