次の方法で共有


Visual Basic での My 名前空間の拡張

Visual Basic の My 名前空間では、.NET Framework の機能を簡単に利用できるプロパティとメソッドが公開されています。 My名前空間を使用すると、一般的なプログラミングの問題が簡略化され、多くの場合、困難なタスクが 1 行のコードに減ります。 さらに、 My 名前空間は完全に拡張可能であるため、 My の動作をカスタマイズし、その階層に新しいサービスを追加して、特定のアプリケーションのニーズに合わせて調整できます。 このトピックでは、 My 名前空間の既存のメンバーをカスタマイズする方法と、独自のカスタム クラスを My 名前空間に追加する方法の両方について説明します。

既存の My 名前空間メンバーのカスタマイズ

Visual Basic の My 名前空間では、アプリケーション、コンピューターなどについてよく使用される情報が公開されます。 My名前空間内のオブジェクトの完全な一覧については、「マイ リファレンス」を参照してください。 アプリケーションのニーズに合わせて、 My 名前空間の既存のメンバーをカスタマイズする必要がある場合があります。 読み取り専用ではない My 名前空間内のオブジェクトのプロパティは、カスタム値に設定できます。

たとえば、 My.User オブジェクトを頻繁に使用して、アプリケーションを実行しているユーザーの現在のセキュリティ コンテキストにアクセスするとします。 ただし、会社ではカスタム ユーザー オブジェクトを使用して、社内のユーザーの追加情報と機能を公開します。 このシナリオでは、次の例に示すように、 My.User.CurrentPrincipal プロパティの既定値を独自のカスタム プリンシパル オブジェクトのインスタンスに置き換えることができます。

My.User.CurrentPrincipal = CustomPrincipal

My.User オブジェクトに CurrentPrincipal プロパティを設定すると、アプリケーションの実行に使用する ID が変更されます。 My.User オブジェクトは、新しく指定されたユーザーに関する情報を返します。

My オブジェクトへのメンバーの追加

My.ApplicationおよびMy.Computerから返される型は、Partial クラスとして定義されます。 そのため、MyApplication または MyComputer という名前のPartial クラスを作成することで、My.ApplicationオブジェクトとMy.Computer オブジェクトを拡張できます。 クラスを Private クラスにすることはできません。 My名前空間の一部としてクラスを指定する場合は、My.ApplicationまたはMy.Computer オブジェクトに含まれるプロパティとメソッドを追加できます。

次の例では、My.Computer オブジェクトに DnsServerIPAddresses という名前のプロパティを追加します。

Imports System.Net.NetworkInformation

Namespace My

  Partial Class MyComputer
    Friend ReadOnly Property DnsServerIPAddresses() As IPAddressCollection
      Get
        Dim dnsAddressList As IPAddressCollection = Nothing

        For Each adapter In System.Net.NetworkInformation.
          NetworkInterface.GetAllNetworkInterfaces()

          Dim adapterProperties = adapter.GetIPProperties()
          Dim dnsServers As IPAddressCollection = adapterProperties.DnsAddresses
          If dnsAddressList Is Nothing Then
            dnsAddressList = dnsServers
          Else
            dnsAddressList.Union(dnsServers)
          End If
        Next adapter

        Return dnsAddressList
      End Get
    End Property
  End Class

End Namespace

My名前空間へのカスタム オブジェクトの追加

My名前空間には、多くの一般的なプログラミング タスクのソリューションが用意されていますが、My名前空間が対処していないタスクが発生する可能性があります。 たとえば、アプリケーションがユーザー データのカスタム ディレクトリ サービスにアクセスしたり、Visual Basic で既定でインストールされていないアセンブリをアプリケーションで使用したりする場合があります。 My名前空間を拡張して、環境に固有の一般的なタスクにカスタム ソリューションを含めることができます。 My名前空間を簡単に拡張して、増大するアプリケーションのニーズに合わせて新しいメンバーを追加できます。 さらに、 My 名前空間拡張機能を Visual Basic テンプレートとして他の開発者にデプロイすることもできます。

My名前空間へのメンバーの追加

Myは他の名前空間と同様の名前空間であるため、モジュールを追加し、MyNamespaceを指定するだけで、最上位レベルのプロパティを追加できます。 次の例に示すように、 HideModuleName 属性を使用してモジュールに注釈を付けます。 HideModuleName属性を使用すると、IntelliSense がMy名前空間のメンバーを表示するときにモジュール名が表示されなくなります。

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

My名前空間にメンバーを追加するには、必要に応じてモジュールにプロパティを追加します。 My名前空間に追加されたプロパティごとに、ThreadSafeObjectProvider(Of T)型のプライベート フィールドを追加します。この型は、カスタム プロパティによって返される型です。 このフィールドは、 GetInstance メソッドを呼び出すことによって、プロパティによって返されるスレッド セーフなオブジェクト インスタンスを作成するために使用されます。 その結果、拡張プロパティにアクセスしている各スレッドは、返された型の独自のインスタンスを受け取ります。 次の例では、My名前空間にSampleExtension型のSampleExtensionという名前のプロパティを追加します。

Namespace My
  <HideModuleName()> 
  Module MyCustomExtensions
    Private _extension As New ThreadSafeObjectProvider(Of SampleExtension)
    Friend ReadOnly Property SampleExtension() As SampleExtension
      Get
        Return _extension.GetInstance()
      End Get
    End Property
  End Module
End Namespace

カスタム My オブジェクトへのイベントの追加

My.Application オブジェクトを使用すると、My名前空間のMyApplication部分クラスを拡張することで、カスタム My オブジェクトのイベントを公開できます。 Windows ベースのプロジェクトの場合は、ソリューション エクスプローラーでプロジェクトの [マイ プロジェクト] ノードをダブルクリックできます。 Visual Basic プロジェクト デザイナーで、[ アプリケーション ] タブをクリックし、[ アプリケーション イベントの表示 ] ボタンをクリックします。 ApplicationEvents.vbという名前の新しいファイルが作成されます。 これには、 MyApplication クラスを拡張するための次のコードが含まれています。

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

カスタム イベント ハンドラーを MyApplication クラスに追加することで、カスタム My オブジェクトのイベント ハンドラーを追加できます。 カスタム イベントを使用すると、イベント ハンドラーが追加、削除、またはイベントが発生したときに実行されるコードを追加できます。 カスタム イベントの AddHandler コードは、イベントを処理するコードがユーザーによって追加された場合にのみ実行されることに注意してください。 たとえば、前のセクションの SampleExtension オブジェクトに、カスタム イベント ハンドラーを追加する Load イベントがあるとします。 次のコード例は、My.SampleExtension.Load イベントが発生したときに呼び出されるSampleExtensionLoadという名前のカスタム イベント ハンドラーを示しています。 新しい My.SampleExtensionLoad イベントを処理するコードが追加されると、このカスタム イベント コードの AddHandler 部分が実行されます。 MyApplication_SampleExtensionLoad メソッドは、My.SampleExtensionLoad イベントを処理するイベント ハンドラーの例を示すコード例に含まれています。 ApplicationEvents.vb ファイルを編集するときに、コード エディターの上にある左側のドロップダウン リストで [マイ アプリケーション イベント] オプションを選択すると、SampleExtensionLoad イベントを使用できます。

Namespace My

  Partial Friend Class MyApplication

    ' Custom event handler for Load event.
    Private _sampleExtensionHandlers As EventHandler

    Public Custom Event SampleExtensionLoad As EventHandler
      AddHandler(ByVal value As EventHandler)
        ' Warning: This code is not thread-safe. Do not call
        ' this code from multiple concurrent threads.
        If _sampleExtensionHandlers Is Nothing Then
          AddHandler My.SampleExtension.Load, AddressOf OnSampleExtensionLoad
        End If
        _sampleExtensionHandlers = 
            System.Delegate.Combine(_sampleExtensionHandlers, value)
      End AddHandler
      RemoveHandler(ByVal value As EventHandler)
        _sampleExtensionHandlers = 
          System.Delegate.Remove(_sampleExtensionHandlers, value)
      End RemoveHandler
      RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
        If _sampleExtensionHandlers IsNot Nothing Then
          _sampleExtensionHandlers.Invoke(sender, e)
        End If
      End RaiseEvent
    End Event

    ' Method called by custom event handler to raise user-defined
    ' event handlers.
    <Global.System.ComponentModel.EditorBrowsable( 
         Global.System.ComponentModel.EditorBrowsableState.Advanced)> 
      Protected Overridable Sub OnSampleExtensionLoad( 
                ByVal sender As Object, ByVal e As EventArgs)
      RaiseEvent SampleExtensionLoad(sender, e)
    End Sub

    ' Event handler to call My.SampleExtensionLoad event.
    Private Sub MyApplication_SampleExtensionLoad( 
        ByVal sender As Object, ByVal e As System.EventArgs
        ) Handles Me.SampleExtensionLoad

    End Sub
  End Class
End Namespace

設計ガイドライン

My名前空間の拡張機能を開発する場合は、次のガイドラインを使用して、拡張機能コンポーネントのメンテナンス コストを最小限に抑えます。

  • 拡張ロジックのみを含めます。 My名前空間拡張機能に含まれるロジックには、My名前空間で必要な機能を公開するために必要なコードのみが含まれている必要があります。 拡張機能はソース コードとしてユーザー プロジェクトに存在するため、拡張機能コンポーネントを更新すると高いメンテナンス コストが発生するため、可能であれば避ける必要があります。
  • プロジェクトの前提条件を最小限に抑えます。 My名前空間の拡張機能を作成するときは、参照、プロジェクト レベルのインポート、または特定のコンパイラ設定のセット (Option Strict オフなど) は想定しないでください。 代わりに、 Global キーワードを使用して依存関係を最小限に抑え、すべての型参照を完全修飾します。 また、拡張機能のエラーを最小限に抑えるために、 Option Strict をオンにして拡張機能がコンパイルされるようにします。
  • 拡張コードを分離します。 コードを 1 つのファイルに配置すると、拡張機能を Visual Studio 項目テンプレートとして簡単に展開できます。 詳細については、このトピックで後述する「拡張機能のパッケージ化と展開」を参照してください。 My名前空間拡張コードをすべて 1 つのファイルまたはプロジェクト内の別のフォルダーに配置すると、ユーザーがMy名前空間拡張機能を見つけるのにも役立ちます。

クラス ライブラリの設計 My

ほとんどのオブジェクト モデルの場合と同様に、一部のデザイン パターンは My 名前空間で適切に機能し、それ以外はうまく機能しません。 My名前空間の拡張機能を設計するときは、次の原則を考慮してください。

  • ステートレス メソッド。 My名前空間のメソッドは、特定のタスクに対する完全なソリューションを提供する必要があります。 メソッドに渡されるパラメーター値によって、特定のタスクを完了するために必要なすべての入力が提供されていることを確認します。 リソースへの接続を開くなど、以前の状態に依存するメソッドを作成しないでください。
  • グローバル インスタンス。 My名前空間で維持される唯一の状態は、プロジェクトに対するグローバルです。 たとえば、 My.Application.Info は、アプリケーション全体で共有される状態をカプセル化します。
  • 単純なパラメーター型。 複雑なパラメーター型を回避して、単純な処理を行います。 代わりに、パラメーター入力を受け取らず、または文字列、プリミティブ型などの単純な入力型を受け取るメソッドを作成します。
  • ファクトリ メソッド。 一部の型は、必ずしもインスタンス化が困難です。 My名前空間の拡張機能としてファクトリ メソッドを提供すると、このカテゴリに分類される型をより簡単に検出して使用できます。 適切に機能するファクトリ メソッドの例として、 My.Computer.FileSystem.OpenTextFileReaderがあります。 .NET Framework では、いくつかのストリームの種類を使用できます。 テキスト ファイルを具体的に指定することで、 OpenTextFileReader は、使用するストリームをユーザーが理解するのに役立ちます。

これらのガイドラインは、クラス ライブラリの一般的な設計原則を妨げるものではありません。 代わりに、Visual Basic と My 名前空間を使用している開発者向けに最適化された推奨事項です。 クラス ライブラリを作成するための一般的な設計原則については、「 フレームワーク設計ガイドライン」を参照してください。

拡張機能のパッケージ化とデプロイ

My名前空間拡張機能を Visual Studio プロジェクト テンプレートに含めたり、拡張機能をパッケージ化して Visual Studio 項目テンプレートとしてデプロイしたりできます。 My名前空間拡張機能を Visual Studio 項目テンプレートとしてパッケージ化すると、Visual Basic によって提供される追加機能を利用できます。 これらの機能を使用すると、プロジェクトが特定のアセンブリを参照するときに拡張機能を含めたり、Visual Basic プロジェクト デザイナーの [個人用拡張機能] ページを使用してMy名前空間拡張機能を明示的に追加したりできます。

名前空間拡張機能 My 展開する方法の詳細については、「 カスタム個人用拡張機能のパッケージ化と展開」を参照してください。

こちらも参照ください