サンプルアプリのライブラリ側にプリンタのクラスを追加しました。
プリンタを表すクラス PrintQueue クラスは DomainObject クラスを継承します。
そして Webアプリでデータソースとして使えるようにします。
<DataObject()>
Public NotInheritable Class PrintQueue
Inherits DomainObject
#Region " プライベートフィールド "
Private ReadOnly _name, _server As String
#End Region
#Region " フレンドコンストラクタ "
'DirectoryEntry を指定して PrintQueue クラスの新しいインスタンスを初期化します。
Friend Sub New(entry As DirectoryEntry)
MyBase.New(entry)
_name = entry.Properties.Item("printerName").Value.ToString()
_server = entry.Properties.Item("serverName").Value.ToString()
End Sub
#End Region
#Region " パブリックプロパティ "
'カラーかどうかを取得または設定します。
Public Property Color As Boolean
Get
If MyBase.IsDisposed Then
Throw New ObjectDisposedException(Me.GetType().Name)
End If
Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printColor").Value)
End Get
Set(value As Boolean)
If MyBase.IsDisposed Then
Throw New ObjectDisposedException(Me.GetType().Name)
End If
MyBase.Entry.Properties.Item("printColor").Value = value
End Set
End Property
※以降の DirectoryEntry を参照するプロパティの Dispose チェックは省略します。
'両面かどうかを取得または設定します。
Public Property Duplex As Boolean
Get
Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printDuplexSupported").Value)
End Get
Set(value As Boolean)
MyBase.Entry.Properties.Item("printDuplexSupported").Value = value
End Set
End Property
'名前を取得します。
Public ReadOnly Property FullName As String
Get
Return MyBase.Name
End Get
End Property
'場所を取得または設定します。
Public Property Location As String
Get
Return DirectCast(MyBase.Entry.Properties.Item("location").Value, String)
End Get
Set(value As String)
MyBase.Entry.Properties.Item("location").Value = value
End Set
End Property
'最高解像度を取得または設定します。
Public Property MaxResolution As Integer?
Get
Return DirectCast(MyBase.Entry.Properties.Item("printMaxResolutionSupported").Value, Integer?)
End Get
Set(value As Integer?)
MyBase.Entry.Properties.Item("printMaxResolutionSupported").Value = value
End Set
End Property
'モデルを取得または設定します。
Public Property Model As String
Get
Return DirectCast(MyBase.Entry.Properties.Item("driverName").Value, String)
End Get
Set(value As String)
MyBase.Entry.Properties.Item("driverName").Value = value
End Set
End Property
'プリンタ名を取得します。
Public Overrides ReadOnly Property Name As String
Get
Return _name
End Get
End Property
'サーバ名を取得します。
Public ReadOnly Property ServerName As String
Get
Return _server
End Get
End Property
'印刷速度を取得または設定します。
Public Property Speed As Integer?
Get
Return DirectCast(MyBase.Entry.Properties.Item("printPagesPerMinute").Value, Integer?)
End Get
Set(value As Integer?)
MyBase.Entry.Properties.Item("printPagesPerMinute").Value = value
End Set
End Property
'ホチキス止めかどうかを取得または設定します。
Public Property Stapling As Boolean
Get
Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printStaplingSupported").Value)
End Get
Set(value As Boolean)
MyBase.Entry.Properties.Item("printStaplingSupported").Value = value
End Set
End Property
#End Region
#Region " パブリックメソッド "
'指定した名前のプリンタを検索します。このメソッドはデータバインド用です。
<DataObjectMethod(DataObjectMethodType.Select)>
Public Shared Function FindByName(name As String) As PrintQueue
Return DirectCast(DirectoryAccess.FindDirectoryObject(name, CategoryType.PrintQueue), PrintQueue)
End Function
'プリンタの一覧を取得します。このメソッドはデータバインド用です。
<DataObjectMethod(DataObjectMethodType.Select)>
Public Shared Function GetPrintQueues() As IList(Of PrintQueue)
Return DirectoryAccess.GetPrintQueues() 'プリンタを取得
End Function
#End Region
End Class
Name プロパティは継承元が name 属性の値を返すようになってます。
プリンタの場合、プリンタのプロパティ画面の項目と属性の対応(全般タブ)で書いた通りプリンタ名を返したいので、printerName 属性の値を返すようオーバーライドしてます。
そして FullName プロパティが name 属性の値を返すようにしてます。
データバインド用のメソッドは Webアプリで必要になります。内部で DirectoryAccess クラスのメソッドを呼んでますが、これについては別途書きます。