다음을 통해 공유


Visual Basic에서 My 네임스페이스 확장

Visual Basic의 네임스페이 My 스는 .NET Framework의 기능을 쉽게 활용할 수 있는 속성과 메서드를 노출합니다. 네임스페이 My 스는 일반적인 프로그래밍 문제를 간소화하여 종종 어려운 작업을 한 줄의 코드로 줄입니다. My 또한 네임스페이스는 완전히 확장 가능하므로 특정 애플리케이션 요구 사항에 맞게 계층 구조에 My 새 서비스의 동작을 사용자 지정하고 추가할 수 있습니다. 이 항목에서는 네임스페이스의 기존 멤버 My 를 사용자 지정하는 방법과 네임스페이스에 사용자 지정 클래스를 추가하는 방법에 대해 설명합니다 My .

기존 My 네임스페이스 멤버 사용자 지정

Visual Basic의 네임스페이 My 스는 애플리케이션, 컴퓨터 등에 대해 자주 사용하는 정보를 노출합니다. 네임스페이스에 있는 My 개체의 전체 목록은 내 참조를 참조하세요. 애플리케이션의 요구 사항과 더 잘 일치하도록 네임스페이스의 기존 멤버 My 를 사용자 지정해야 할 수 있습니다. 읽기 전용이 아닌 네임스페이스에 있는 My 개체의 모든 속성을 사용자 지정 값으로 설정할 수 있습니다.

예를 들어, 애플리케이션을 실행 중인 사용자의 현재 보안 컨텍스트에 액세스하기 위해 My.User 개체를 자주 사용하는 경우를 가정합니다. 그러나 회사에서는 사용자 지정 사용자 개체를 사용하여 회사 내 사용자에 대한 추가 정보 및 기능을 노출합니다. 이 시나리오에서는 다음 예제와 같이 속성의 My.User.CurrentPrincipal 기본값을 사용자 지정 보안 주체 개체의 인스턴스로 바꿀 수 있습니다.

My.User.CurrentPrincipal = CustomPrincipal

개체에 CurrentPrincipal 속성을 My.User 설정하면 애플리케이션이 실행되는 ID가 변경됩니다. 새로 지정한 사용자에 대한 정보를 My.User 개체가 반환합니다.

개체에 My 멤버 추가

My.ApplicationMy.Computer이 반환하는 타입은 Partial 클래스들로 정의됩니다. 따라서 My.ApplicationMy.Computer라고 명명된 PartialMyApplication 클래스 객체를 만들어 MyComputer 객체를 확장할 수 있습니다. 클래스는 Private 클래스일 수 없습니다. 네임스페이스에서 클래스를 My으로 지정하면 My.Application 또는 My.Computer 개체에 포함될 속성과 메서드를 추가할 수 있습니다.

다음 예제에서는 DnsServerIPAddresses 객체에 명명된 My.Computer 속성을 추가합니다.

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 스를 쉽게 확장하여 증가하는 애플리케이션 요구 사항에 맞게 새 멤버를 추가할 수 있습니다. 또한 다른 개발자에게 네임스페이스 확장을 Visual Basic 템플릿으로 배포 My 할 수 있습니다.

네임스페이스에 My 멤버 추가

다른 네임스페이스와 같은 네임스페이스이므로 My 모듈을 추가하고 다음을 지정하여 NamespaceMy최상위 속성을 추가할 수 있습니다. 다음 예제에서 보여준 대로 HideModuleName 속성을 사용하여 모듈에 주석을 추가합니다. 이 특성은 HideModuleName IntelliSense가 네임스페이스의 멤버 My 를 표시할 때 모듈 이름을 표시하지 않도록 합니다.

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

네임스페이스에 멤버를 My 추가하려면 필요에 따라 모듈에 속성을 추가합니다. 네임스페이스에 추가된 각 속성에 My 대해 형식 ThreadSafeObjectProvider(Of T)의 프라이빗 필드를 추가합니다. 여기서 형식은 사용자 지정 속성에서 반환하는 형식입니다. 이 필드는 GetInstance 메서드를 호출하여 속성에 의해 반환될 스레드 안전 개체 인스턴스를 만드는 데 사용됩니다. 따라서 확장 속성에 액세스하는 각 스레드는 반환된 형식의 자체 인스턴스를 받습니다. 다음 예제에서는 형식이 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 partial 클래스를 확장하여 MyApplication 객체를 사용하여 사용자 지정 My 객체에 대한 이벤트를 노출할 수 있습니다. Windows 기반 프로젝트의 경우 솔루션 탐색기에서 프로젝트에 대한 내 프로젝트 노드를 두 번 클릭할 수 있습니다. Visual Basic 프로젝트 디자이너에서 애플리케이션 탭을 클릭한 다음 애플리케이션 이벤트 보기 단추를 클릭합니다. 이름이 ApplicationEvents.vb 새 파일이 만들어집니다. 클래스를 확장하기 위한 다음 코드가 포함되어 있습니다 MyApplication .

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

사용자 지정 My 클래스에 이벤트 처리기를 추가하면 사용자 지정 MyApplication 개체에 대한 이벤트 처리기를 추가할 수 있습니다. 사용자 지정 이벤트를 사용하면 이벤트 처리기가 추가되거나 제거되거나 이벤트가 발생할 때 실행되는 코드를 추가할 수 있습니다. AddHandler 사용자 지정 이벤트에 대한 코드는 사용자가 이벤트를 처리하기 위해 코드를 추가한 경우에만 실행됩니다. 예를 들어 이전 섹션 SampleExtensionLoad 개체에 사용자 지정 이벤트 처리기를 추가하려는 이벤트가 있다고 생각해 보세요. 다음 코드 예제는 SampleExtensionLoad로 명명된 사용자 지정 이벤트 처리기가 My.SampleExtension.Load 이벤트가 발생할 때 호출되는 방법을 보여 줍니다. 새 My.SampleExtensionLoad 이벤트를 AddHandler 처리하기 위해 코드를 추가하면 이 사용자 지정 이벤트 코드의 일부가 실행됩니다. 코드 예제에는 MyApplication_SampleExtensionLoad 메서드가 My.SampleExtensionLoad 이벤트를 처리하는 이벤트 처리기의 예로 포함되어 있습니다. SampleExtensionLoad 이 이벤트는 ApplicationEvents.vb 파일을 편집할 때 코드 편집기 위의 왼쪽 드롭다운 목록에서 내 애플리케이션 이벤트 옵션을 선택할 때 사용할 수 있습니다.

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 : off)을 가정하지 마세요. 대신 Global 키워드를 사용하여 종속성을 최소화하고 모든 형식 참조를 완전히 정규화합니다. 또한 확장에서 오류를 최소화하기 위해 확장이 on으로 Option Strict 컴파일되는지 확인합니다.
  • 확장 코드를 격리하십시오. 코드를 단일 파일에 배치하면 확장을 Visual Studio 항목 템플릿으로 쉽게 배포할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 있는 "확장 패키징 및 배포"를 참조하세요. 모든 My 네임스페이스 확장 코드를 프로젝트의 단일 파일 또는 별도의 폴더에 배치하면 사용자가 네임스페이스 확장명을 My 찾는 데도 도움이 됩니다.

My에 대한 클래스 라이브러리 설계

대부분의 개체 모델의 경우와 마찬가지로 일부 디자인 패턴은 네임스페이 My 스에서 잘 작동하며 다른 디자인 패턴은 그렇지 않습니다. 네임스페이스에 대한 확장을 디자인할 My 때 다음 원칙을 고려합니다.

  • 무상태 메서드. 네임스페이스의 My 메서드는 특정 작업에 대한 완전한 솔루션을 제공해야 합니다. 메서드에 전달되는 매개 변수 값이 특정 작업을 완료하는 데 필요한 모든 입력을 제공하는지 확인합니다. 리소스에 대한 연결 열기와 같이 이전 상태를 사용하는 메서드를 만들지 않습니다.
  • 전역 인스턴스. My 네임스페이스에서 유지 관리되는 유일한 상태는 프로젝트에 대한 전역 상태입니다. 예를 들어 My.Application.Info 애플리케이션 전체에서 공유되는 상태를 캡슐화합니다.
  • 단순 매개 변수 형식입니다. 복잡한 매개 변수 형식을 방지하여 작업을 단순하게 유지합니다. 대신 매개 변수 입력을 사용하지 않거나 문자열, 기본 형식 등과 같은 간단한 입력 형식을 사용하는 메서드를 만듭니다.
  • 팩터리 메서드. 일부 형식은 인스턴스화하기가 반드시 어렵습니다. 팩터리 메서드를 네임스페이스에 대한 My 확장으로 제공하면 이 범주에 속하는 형식을 보다 쉽게 검색하고 사용할 수 있습니다. 잘 작동하는 팩터리 메서드의 예는 다음과 같습니다 My.Computer.FileSystem.OpenTextFileReader. .NET Framework에는 여러 스트림 형식을 사용할 수 있습니다. 텍스트 파일을 구체적으로 OpenTextFileReader 지정하면 사용자가 사용할 스트림을 이해할 수 있습니다.

이러한 지침은 클래스 라이브러리에 대한 일반적인 디자인 원칙을 배제하지 않습니다. 대신 Visual Basic 및 My 네임스페이스를 사용하는 개발자에게 최적화된 권장 사항입니다. 클래스 라이브러리를 만들기 위한 일반적인 디자인 원칙은 프레임워크 디자인 지침을 참조하세요.

확장 패키징 및 배포

Visual Studio 프로젝트 템플릿에 네임스페이스 확장을 포함 My 하거나 확장을 패키지하고 Visual Studio 항목 템플릿으로 배포할 수 있습니다. 네임스페이스 확장My을 Visual Studio 항목 템플릿으로 패키지할 때 Visual Basic에서 제공하는 추가 기능을 활용할 수 있습니다. 이러한 기능을 사용하면 프로젝트가 특정 어셈블리를 참조할 때 확장을 포함하거나 사용자가 Visual Basic 프로젝트 디자이너의 My 페이지를 사용하여 네임스페이스 확장을 명시적으로 추가할 수 있습니다.

네임스페이스 확장을 배포 My 하는 방법에 대한 자세한 내용은 사용자 지정 내 확장 패키징 및 배포를 참조하세요.

참고하십시오