ServiceContainerとは? わかりやすく解説

ServiceContainer クラス

IServiceContainer インターフェイス単純な実装提供します。このクラス継承できません。

名前空間: System.ComponentModel.Design
アセンブリ: System (system.dll 内)
構文構文

Public Class ServiceContainer
    Implements IServiceContainer, IServiceProvider, IDisposable
Dim instance As ServiceContainer
public class ServiceContainer : IServiceContainer,
 IServiceProvider, IDisposable
public ref class ServiceContainer : IServiceContainer,
 IServiceProvider, IDisposable
public class ServiceContainer implements IServiceContainer,
 IServiceProvider, 
    IDisposable
public class ServiceContainer implements IServiceContainer,
 IServiceProvider, 
    IDisposable
解説解説

ServiceContainer オブジェクト使用してサービス格納および提供できますServiceContainer は、IServiceContainer インターフェイス実装ます。

ServiceContainer オブジェクトは、親の IServiceContainer追加するコンストラクタ使用して作成できます。これを通じてサービスは、直接の親である IServiceContainer を含む、すべてのIServiceContainer オブジェクト必要に応じて追加または削除できます。親であることを使用して、この IServiceContainerリンクするすべての IServiceContainer 実装に対してサービス追加または削除するには、サービス要求昇格させるかどうかを示す Boolean 値を受け取る AddService または RemoveService のメソッド オーバーロード呼び出します。

メモメモ

このクラス適用される HostProtectionAttribute 属性Resources プロパティの値は、SharedState です。HostProtectionAttribute は、デスクトップ アプリケーション (一般的にはアイコンダブルクリックコマンド入力、またはブラウザURL入力して起動するアプリケーション) には影響しません。詳細については、HostProtectionAttribute クラストピックまたは「SQL Server プログラミングホスト保護属性」を参照してください

使用例使用例

サービス チェイン流れと、リンクされServiceContainer オブジェクトチェインにおけるサービス可用性を示すプログラムの例次に示します。この例のプログラムでは、リンクされサービスチェイン内におけるサービス可用性確認できるユーザー インターフェイス提供しますまた、AddService、GetService、RemoveService の各メソッドリンクされサービス コンテナ使用してます。

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

' Example form provides UI for demonstrating service sharing behavior
 
' of a network of IServiceContainer/IServiceProvider controls.
Public Class ServiceForm
    Inherits System.Windows.Forms.Form
   
    ' Root service container control for tree.
    Private root As ServiceObjectControl  
    
    
    ' Button for clearing any provided services and resetting tree states.
    Private WithEvents reset_button As
 System.Windows.Forms.Button

    ' Color list used to color code controls.
    Private colorkeys() As Color

    ' Strings used to reflect text service.
    Private keystrings() As String
          
   
   Public Sub New()
      InitializeComponent()
      CreateServiceControlTree()
      colorkeys = New Color() {Color.Beige, Color.SeaShell, Color.LightGreen,
 Color.LightBlue, Color.Khaki, Color.CadetBlue}
      keystrings = New String() {"No
 service use", "Service not accessible",
 "Service provided", "Service obtained", "Service accessible", "No
 further access"}
    End Sub

    Private Sub CreateServiceControlTree()
        ' Create root service control.
        Dim control1 As New
 ServiceObjectControl(Nothing, New Size(300,
 40), New Point(10, 80), Me)
        root = control1
        ' Create first tier - pass parent with service object control
 1
        Dim control2 As New
 ServiceObjectControl(control1, New Size(200, 30), New
 Point(50, 160), Me)
        Dim control3 As New
 ServiceObjectControl(control1, New Size(200, 30), New
 Point(50, 240), Me)
        ' Create second tier A - pass parent with service object control
 2
        Dim control4 As New
 ServiceObjectControl(control2, New Size(180, 20), New
 Point(300, 145), Me)
        Dim control5 As New
 ServiceObjectControl(control2, New Size(180, 20), New
 Point(300, 185), Me)
        ' Create second tier B - pass parent with service object control
 3
        Dim control6 As New
 ServiceObjectControl(control3, New Size(180, 20), New
 Point(300, 225), Me)
        Dim control7 As New
 ServiceObjectControl(control3, New Size(180, 20), New
 Point(300, 265), Me)
        ' Add controls.
        Me.Controls.AddRange(New Control()
 {control1, control2, control3, control4, control5, control6, control7})
    End Sub

    Friend Sub ResetServiceTree(ByVal
 sender As Object, ByVal
 e As EventArgs) Handles reset_button.Click
        ' Remove the service from the service tree.
        If Not (root.serviceContainer.GetService(GetType(TextService))
 Is Nothing) Then
            root.serviceContainer.RemoveService(GetType(TextService),
 True)
        End If
        ' Set all controls to "not obtained" and clear their
 labels.
        Dim i As Integer
        For i = 0 To Controls.Count - 1
            If Not Controls(i).Equals(reset_button)
 Then
                CType(Controls(i), ServiceObjectControl).state = TextServiceState.ServiceNotObtained
                CType(Controls(i), ServiceObjectControl).label = String.Empty
                CType(Controls(i), ServiceObjectControl).BackColor = Color.Beige
            End If
        Next i
    End Sub

    Public Sub UpdateServiceCoverage()
        ' Have each control set state to reflect service availability.
        Dim i As Integer
        For i = 0 To Controls.Count - 1
            If Not Controls(i).Equals(reset_button)
 Then
                CType(Controls(i), ServiceObjectControl).ReflectServiceVisibility()
            End If
        Next i
    End Sub

    Private Sub InitializeComponent()
        Me.reset_button = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'reset_button
        '
        Me.reset_button.Location = New System.Drawing.Point(392,
 88)
        Me.reset_button.Name = "reset_button"
        Me.reset_button.TabIndex = 0
        Me.reset_button.TabStop = False
        Me.reset_button.Text = "Reset"
        '
        'ServiceForm
        '
        Me.ClientSize = New System.Drawing.Size(512,
 373)
        Me.Controls.AddRange(New System.Windows.Forms.Control()
 {Me.reset_button})
        Me.MinimumSize = New System.Drawing.Size(520,
 400)
        Me.Name = "ServiceForm"
        Me.Text = "Service Container Architecture
 Example"
        Me.ResumeLayout(False)

    End Sub

    <STAThread()> _
    Shared Sub Main()
        Application.Run(New ServiceForm())
    End Sub

    Protected Overrides Sub
 OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawString("The following tree diagram represents
 a hierarchy of linked service containers in controls.", New
 Font("Arial", 9), New SolidBrush(Color.Black), 4, 4)
        e.Graphics.DrawString("This example demonstrates the propagation
 behavior of services through a linked service object tree.", New
 Font("Arial", 8), New SolidBrush(Color.Black), 4, 26)
        e.Graphics.DrawString("Right-click a component to add
 or replace a text service, or to remove it if the component provided it.",
 New Font("Arial", 8), New SolidBrush(Color.Black), 4, 38)
        e.Graphics.DrawString("Left-click a component to update
 text from the text service if available.", New Font("Arial",
 8), New SolidBrush(Color.Black), 4, 50)

        ' Draw lines to represent tree branches.
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 20, 125, 20, 258)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 21, 175, 45, 175)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 21, 258, 45, 258)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 255, 175, 285, 175)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 255, 258, 285, 258)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 155, 285, 195)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 238, 285, 278)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 155, 290, 155)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 195, 290, 195)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 238, 290, 238)
        e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black),
 1), 285, 278, 290, 278)

        ' Draw color key.
        e.Graphics.DrawRectangle(New Pen(New
 SolidBrush(Color.Black), 1), 20, 305, 410, 60)
        Dim y As Integer
 = 0
        Dim i As Integer
        For i = 0 To 2
            e.Graphics.FillRectangle(New SolidBrush(colorkeys(y)),
 25 + i * 140, 310, 20, 20)
            e.Graphics.DrawRectangle(New Pen(New
 SolidBrush(Color.Black), 1), 25 + i * 140, 310, 20, 20)
            e.Graphics.DrawString(keystrings(y), New Font("Arial",
 8), New SolidBrush(Color.Black), 50 + i * 140, 315)
            y += 1
            e.Graphics.FillRectangle(New SolidBrush(colorkeys(y)),
 25 + i * 140, 340, 20, 20)
            e.Graphics.DrawRectangle(New Pen(New
 SolidBrush(Color.Black), 1), 25 + i * 140, 340, 20, 20)
            e.Graphics.DrawString(keystrings(y), New Font("Arial",
 8), New SolidBrush(Color.Black), 50 + i * 140, 345)
            y += 1
        Next i
    End Sub
End Class

' An example user control that uses ServiceContainer to add, remove,
 
' and access services through a linkable service container network.
Public Class ServiceObjectControl
    Inherits System.Windows.Forms.UserControl

    ' This example user control implementation provides a wrapper for
 
    ' ServiceContainer, supporting a linked service container network.
    Public serviceContainer As serviceContainer
    ' Parent form reference for main program function access.
    Private parentserviceForm As ServiceForm
    ' String for label displayed on the control to indicate the 
    ' control's current service-related configuration state.
    Public label As String
    
    ' The current state of the control reflecting whether it has 
    ' obtained or provided a text service.
    Private state_ As TextServiceState
    Public Property state() As
 TextServiceState
        Get
            Return state_
        End Get
        Set(ByVal Value As
 TextServiceState)
            If CType(Value, TextServiceState) = TextServiceState.ServiceProvided
 Then
                Me.BackColor = Color.LightGreen
            ElseIf CType(Value, TextServiceState) = TextServiceState.ServiceNotObtained
 Then
                Me.BackColor = Color.White
            ElseIf CType(Value, TextServiceState) = TextServiceState.ServiceObtained
 Then
                Me.BackColor = Color.LightBlue
            ElseIf CType(Value, TextServiceState) = TextServiceState.ServiceNotFound
 Then
                Me.BackColor = Color.SeaShell
            End If
            state_ = Value
        End Set
    End Property    

    Public Sub New(ByVal
 serviceContainerParent As ServiceObjectControl, ByVal
 size As Size, ByVal location As Point, ByVal parent As ServiceForm)
        Me.state_ = TextServiceState.ServiceNotObtained
        Me.BackColor = Color.Beige
        Me.label = String.Empty
        Me.Size = size
        Me.Location = location
        Me.parentserviceForm = parent        
        If serviceContainerParent Is Nothing
 Then
            serviceContainer = New ServiceContainer()
        Else
            serviceContainer = New ServiceContainer(serviceContainerParent.serviceContainer)
        End If
    End Sub

    ' Paint method override draws the label string on the control.
    Protected Overrides Sub
 OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawString(label, New Font("Arial",
 8), New SolidBrush(Color.Black), 5, 5)
    End Sub

    ' Process mouse-down behavior for click.
    Protected Overrides Sub
 OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        If e.Button = System.Windows.Forms.MouseButtons.Left Then
            If state_ <> TextServiceState.ServiceProvided
 Then
                ' Attempt to update text from service, and set color
 
                ' state accordingly.
                Dim ts As TextService = CType(serviceContainer.GetService(GetType(TextService)),
 TextService)
                If Not (ts Is
 Nothing) Then
                    Me.label = ts.text
                    state = TextServiceState.ServiceObtained
                Else
                    Me.label = "Service Not
 Found"
                    state = TextServiceState.ServiceNotFound
                End If
            End If
        End If
        If e.Button = System.Windows.Forms.MouseButtons.Right
 Then
            If state_ = TextServiceState.ServiceProvided Then
                ' Remove service if the container provided it.
                If Not (serviceContainer.GetService(GetType(TextService))
 Is Nothing) Then
                    serviceContainer.RemoveService(GetType(TextService),
 True)
                    state = TextServiceState.ServiceNotObtained
                    Me.label = "Service Removed"
                End If
            Else
                ' Obtain string and provide text service.
                Dim form As New
 StringInputDialog("Test String")
                form.StartPosition = FormStartPosition.CenterParent
                If form.ShowDialog() = DialogResult.OK Then
                    If Not (serviceContainer.GetService(GetType(TextService))
 Is Nothing) Then
                        serviceContainer.RemoveService(GetType(TextService),
 True)
                    End If
                    parentserviceForm.ResetServiceTree(Me, New
 EventArgs())
                    serviceContainer.AddService(GetType(TextService),
 New TextService(form.inputTextBox.Text), True)
                    state = TextServiceState.ServiceProvided
                    Me.label = "Provided Text:
 " + form.inputTextBox.Text
                End If
            End If
        End If
        parentserviceForm.UpdateServiceCoverage()
    End Sub

    ' Method accesses the TextService to test the visibility of the
 service 
    ' from the control, and sets the UI state accordingly.
    Public Sub ReflectServiceVisibility()
        If state_ = TextServiceState.ServiceObtained Then
            If serviceContainer.GetService(GetType(TextService))
 Is Nothing Then
                Me.BackColor = Color.CadetBlue
            End If
        ElseIf state_ <> TextServiceState.ServiceProvided
 Then
            If serviceContainer.GetService(GetType(TextService))
 Is Nothing Then
                Me.BackColor = Color.White
                Return
            End If

            ' Service available.                   
            If state_ = TextServiceState.ServiceNotFound Then
                Me.BackColor = Color.Khaki
            ElseIf state_ = TextServiceState.ServiceNotObtained
 AndAlso label <> "Service Removed"
 Then
                Me.BackColor = Color.Khaki
            End If
        End If
    End Sub

End Class

' Example service type contains a text string, sufficient 
' for use to demonstrate service sharing.
Public Class TextService
    Public [text] As String

    Public Sub New()
        MyClass.New(String.Empty)
    End Sub

    Public Sub New(ByVal
 [text] As String)
        Me.text = [text]
    End Sub
End Class

Public Enum TextServiceState
    ServiceNotObtained
    ServiceObtained
    ServiceProvided
    ServiceNotFound
End Enum

' Example Form for entering a string.
Friend Class StringInputDialog
    Inherits System.Windows.Forms.Form

    Private ok_button As System.Windows.Forms.Button
    Private cancel_button As System.Windows.Forms.Button
    Public inputTextBox As System.Windows.Forms.TextBox

    Public Sub New(ByVal
 [text] As String)
        InitializeComponent()
        inputTextBox.Text = [text]
    End Sub

    Private Sub InitializeComponent()
        Me.ok_button = New System.Windows.Forms.Button()
        Me.cancel_button = New System.Windows.Forms.Button()
        Me.inputTextBox = New System.Windows.Forms.TextBox()
        Me.SuspendLayout()
        Me.ok_button.Anchor = System.Windows.Forms.AnchorStyles.Bottom
 Or System.Windows.Forms.AnchorStyles.Right
        Me.ok_button.Location = New System.Drawing.Point(180,
 43)
        Me.ok_button.Name = "ok_button"
        Me.ok_button.TabIndex = 1
        Me.ok_button.Text = "OK"
        Me.ok_button.DialogResult = System.Windows.Forms.DialogResult.OK
        Me.cancel_button.Anchor = System.Windows.Forms.AnchorStyles.Bottom
 Or System.Windows.Forms.AnchorStyles.Right
        Me.cancel_button.Location = New System.Drawing.Point(260,
 43)
        Me.cancel_button.Name = "cancel_button"
        Me.cancel_button.TabIndex = 2
        Me.cancel_button.Text = "Cancel"
        Me.cancel_button.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.inputTextBox.Location = New System.Drawing.Point(6,
 9)
        Me.inputTextBox.Name = "inputTextBox"
        Me.inputTextBox.Size = New System.Drawing.Size(327,
 20)
        Me.inputTextBox.TabIndex = 0
        Me.inputTextBox.Text = ""
        Me.inputTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top
 Or System.Windows.Forms.AnchorStyles.Left Or
 System.Windows.Forms.AnchorStyles.Right
        Me.ClientSize = New System.Drawing.Size(342,
 73)
        Me.Controls.AddRange(New System.Windows.Forms.Control()
 {Me.inputTextBox, Me.cancel_button, Me.ok_button})
        Me.MinimumSize = New System.Drawing.Size(350,
 100)
        Me.Name = "StringInputDialog"
        Me.Text = "Text Service Provide String
 Dialog"
        Me.ResumeLayout(False)
    End Sub

End Class
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace ServiceArchitectureExample
{
    // Example form provides UI for demonstrating service sharing behavior
 
    // of a network of IServiceContainer/IServiceProvider controls.
    public class ServiceForm : System.Windows.Forms.Form
    {                
        // Root service container control for tree.
        private ServiceObjectControl root;         
             
        // Button for clearing any provided services and resetting tree
 states.
        private System.Windows.Forms.Button reset_button;    
   

        // Color list used to color code controls.
        private Color[] colorkeys;                           
   

        // Strings used to reflect text service.
        private string[] keystrings;      
                      

        public ServiceForm()
        {
            InitializeComponent();
            CreateServiceControlTree();
            colorkeys = new Color[] { Color.Beige, Color.SeaShell,
 Color.LightGreen, Color.LightBlue, Color.Khaki, Color.CadetBlue };
            keystrings = new string[] { "No
 service use", "Service not accessible", "Service provided",
 "Service obtained", "Service accessible", "No further access" };
        }

        private void CreateServiceControlTree()
        {
            // Create root service control.
            ServiceObjectControl control1 = new ServiceObjectControl(null,
 new Size(300, 40), new Point(10, 80), this);
            root = control1;
            // Create first tier - pass parent with service object control
 1
            ServiceObjectControl control2 = new ServiceObjectControl(control1
,
 new Size(200, 30), new Point(50, 160), this);
            ServiceObjectControl control3 = new ServiceObjectControl(control1
,
 new Size(200, 30), new Point(50, 240), this);
            // Create second tier A - pass parent with service object
 control 2
            ServiceObjectControl control4 = new ServiceObjectControl(control2
,
 new Size(180, 20), new Point(300, 145), this);
            ServiceObjectControl control5 = new ServiceObjectControl(control2,
 new Size(180, 20), new Point(300, 185), this);
            // Create second tier B - pass parent with service object
 control 3
            ServiceObjectControl control6 = new ServiceObjectControl(control3
,
 new Size(180, 20), new Point(300, 225), this);
            ServiceObjectControl control7 = new ServiceObjectControl(control3,
 new Size(180, 20), new Point(300, 265), this);
            // Add controls.
            this.Controls.AddRange( new Control[]
 { control1, control2, control3, control4, control5, control6, control7 } );
        }

        internal void ResetServiceTree(object sender, EventArgs
 e)
        {
            // Remove the service from the service tree.
            if( root.serviceContainer.GetService(typeof(TextService))
 != null )            
                root.serviceContainer.RemoveService(typeof(TextService), true);

            // Set all controls to "not obtained" and clear
 their labels.
            for( int i=0; i<Controls.Count;
 i++ )
                if( !Controls[i].Equals(reset_button) ) 
                {
                    ((ServiceObjectControl)Controls[i]).state = TextServiceState.ServiceNotObtained;
                    ((ServiceObjectControl)Controls[i]).label = string.Empty;
                    ((ServiceObjectControl)Controls[i]).BackColor = Color.Beige;
                }
        }

        public void UpdateServiceCoverage()
        {
            // Have each control set state to reflect service availability.
            for( int i=0; i<Controls.Count;
 i++ )
                if( !Controls[i].Equals(reset_button) )      
           
                    ((ServiceObjectControl)Controls[i]).ReflectServiceVisibility();
                                 
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.reset_button = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // reset_button
            // 
            this.reset_button.Location = new
 System.Drawing.Point(392, 88);
            this.reset_button.Name = "reset_button";
            this.reset_button.TabIndex = 0;
            this.reset_button.TabStop = false;
            this.reset_button.Text = "Reset";
            this.reset_button.Click += new
 System.EventHandler(this.ResetServiceTree);
            // 
            // ServiceForm
            // 
            this.ClientSize = new System.Drawing.Size(512,
 373);
            this.Controls.AddRange(new System.Windows.Forms.Control[]
 {
                                                                          this.reset_button});
            this.MinimumSize = new System.Drawing.Size(520,
 400);
            this.Name = "ServiceForm";
            this.Text = "Service Container Architecture Example";
            this.ResumeLayout(false);

        }
        #endregion

        [STAThread]
        static void Main() 
        {
            Application.Run(new ServiceForm());
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs
 e)
        {            
            e.Graphics.DrawString("The following tree diagram represents a hierarchy
 of linked service containers in controls.", new
 Font("Arial", 9), new SolidBrush(Color.Black), 4, 4);
            e.Graphics.DrawString("This example demonstrates the propagation
 behavior of services through a linked service object tree.", new
 Font("Arial", 8), new SolidBrush(Color.Black), 4, 26);            
            e.Graphics.DrawString("Right-click a component to add or replace
 a text service, or to remove it if the component provided it.",
 new Font("Arial", 8), new SolidBrush(Color.Black), 4, 38);
            e.Graphics.DrawString("Left-click a component to update text from
 the text service if available.", new
 Font("Arial", 8), new SolidBrush(Color.Black), 4, 50);

            // Draw lines to represent tree branches.
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 20, 125, 20, 258);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 21, 175, 45, 175);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 21, 258, 45, 258);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 255, 175, 285, 175);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 255, 258, 285, 258);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 155, 285, 195);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 238, 285, 278);            
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 155, 290, 155);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 195, 290, 195);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 238, 290, 238);
            e.Graphics.DrawLine(new Pen(new
 SolidBrush(Color.Black), 1), 285, 278, 290, 278);

            // Draw color key.
            e.Graphics.DrawRectangle(new Pen(new
 SolidBrush(Color.Black), 1), 20, 305, 410, 60);
            int y=0;
            for( int i=0; i<3; i++ )
            {
                e.Graphics.FillRectangle(new SolidBrush(colorkeys[y]),
 25+(i*140), 310, 20, 20);           
                e.Graphics.DrawRectangle(new Pen(new
 SolidBrush(Color.Black), 1), 25+(i*140), 310, 20, 20);     
                e.Graphics.DrawString(keystrings[y], new Font("Arial",
 8), new SolidBrush(Color.Black), 50+(i*140), 315);
                y++;
                e.Graphics.FillRectangle(new SolidBrush(colorkeys[y]),
 25+(i*140), 340, 20, 20);           
                e.Graphics.DrawRectangle(new Pen(new
 SolidBrush(Color.Black), 1), 25+(i*140), 340, 20, 20);              
                e.Graphics.DrawString(keystrings[y], new Font("Arial",
 8), new SolidBrush(Color.Black), 50+(i*140), 345);
                y++;
            }
        }
    }

    // An example user control that uses ServiceContainer to add, remove
,
    // and access services through a linkable service container network.
    public class ServiceObjectControl : System.Windows.Forms.UserControl
    {
        // This example user control implementation provides a wrapper
 for 
        // ServiceContainer, supporting a linked service container network.
    
        public ServiceContainer serviceContainer;        
        // Parent form reference for main program function access.
        private ServiceForm parent;                  
        // String for label displayed on the control to indicate the
 
        // control's current service-related configuration state.
        public string label;              
 
        // The current state of the control reflecting whether it has
 
        // obtained or provided a text service.
        private TextServiceState state_;
        public TextServiceState state
        {
            get
            {
                return state_;
            }
            set
            {
                if( (TextServiceState)value == TextServiceState.ServiceProvided
 )
                    this.BackColor = Color.LightGreen;
                else if( (TextServiceState)value
 == TextServiceState.ServiceNotObtained )                
                    this.BackColor = Color.White;            
                       
                else if( (TextServiceState)value
 == TextServiceState.ServiceObtained )
                    this.BackColor = Color.LightBlue;
                else if( (TextServiceState)value
 == TextServiceState.ServiceNotFound )                                    
                    this.BackColor = Color.SeaShell;         
       
                state_ = value;
            }
        }        
        
        public ServiceObjectControl(ServiceObjectControl serviceContainerParent
,
 Size size, Point location, ServiceForm parent)
        {
            this.state_ = TextServiceState.ServiceNotObtained;
            this.BackColor = Color.Beige;            
            this.label = string.Empty;    
        
            this.Size = size;
            this.Location = location;
            this.parent = parent;            
            if( serviceContainerParent == null
 )
                serviceContainer = new ServiceContainer();
            else
                serviceContainer = new ServiceContainer(serviceContainerParent.serviceContainer);
        }

        // Paint method override draws the label string on the control.
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs
 e)
        {
            e.Graphics.DrawString(label, new Font("Arial",
 8), new SolidBrush(Color.Black), 5, 5);            
        }

        // Process mouse-down behavior for click.
        protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs
 e)
        {
            if( e.Button == MouseButtons.Left )
            {
                if( state_ != TextServiceState.ServiceProvided
 )
                {
                    // Attempt to update text from service, and set
 color 
                    // state accordingly.
                    TextService ts = (TextService)serviceContainer.GetService(typeof(TextService));
                    if( ts != null )
                    {
                        this.label = ts.text;
                        state = TextServiceState.ServiceObtained;
                    }
                    else
                    {                    
                        this.label = "Service Not Found";
                        
                        state = TextServiceState.ServiceNotFound;
                    }
                }
            }
            if( e.Button == MouseButtons.Right )
            {
                if( state_ == TextServiceState.ServiceProvided
 )
                {
                    // Remove service if the container provided it.
                    if( serviceContainer.GetService(typeof(TextService))
 != null )
                    {
                        serviceContainer.RemoveService(typeof(TextService), true);
                        state = TextServiceState.ServiceNotObtained; 
                        this.label = "Service Removed";
                                                                   
                    }                    
                }
                else
                {
                    // Obtain string and provide text service.
                    StringInputDialog form = new StringInputDialog("Test
 String");
                    form.StartPosition = FormStartPosition.CenterParent;
                    if( form.ShowDialog() == DialogResult.OK )
                    {
                        if( serviceContainer.GetService(typeof(TextService))
 != null )                        
                            serviceContainer.RemoveService(typeof(TextService), true);
                                                                            
                        parent.ResetServiceTree(this, new
 EventArgs());
                        serviceContainer.AddService(typeof(TextService), new
 TextService( form.inputTextBox.Text ), true);
                        state = TextServiceState.ServiceProvided;
                        this.label = "Provided Text: "+form.inputTextBox.Text;
                                 
                    }
                }
            }
            parent.UpdateServiceCoverage();
        }

        // Method accesses the TextService to test the visibility of
 the service 
        // from the control, and sets the UI state accordingly.
        public void ReflectServiceVisibility()
        {
            if( state_ == TextServiceState.ServiceObtained )
            {
                if( serviceContainer.GetService(typeof(TextService))
 == null )  
                    this.BackColor = Color.CadetBlue;
            }
            else if( state_ != TextServiceState.ServiceProvided
 )
            {
                if( serviceContainer.GetService(typeof(TextService))
 == null )
                {
                    this.BackColor = Color.White;
                    return;
                }

                // Service available.                  
                if( state_ == TextServiceState.ServiceNotFound
 )                
                    this.BackColor = Color.Khaki;            
    
                else if( state_ == TextServiceState.ServiceNotObtained
 && label != "Service Removed" )
                    this.BackColor = Color.Khaki;       
            }            
        }
    }

    // Example service type contains a text string, sufficient 
    // to demonstrate service sharing.
    public class TextService
    {
        public string text;

        public TextService() : this(string.Empty)
        {
        }

        public TextService(string text)
        {
            this.text = text;
        }
    }

    public enum TextServiceState
    {
        ServiceNotObtained,
        ServiceObtained,
        ServiceProvided,
        ServiceNotFound
    }

    // Example Form for entering a string.
    internal class StringInputDialog : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button ok_button;
        private System.Windows.Forms.Button cancel_button;
        public System.Windows.Forms.TextBox inputTextBox;

        public StringInputDialog(string text)
        {
            InitializeComponent();
            inputTextBox.Text = text;
        }

        private void InitializeComponent()
        {
            this.ok_button = new System.Windows.Forms.Button();
            this.cancel_button = new System.Windows.Forms.Button();
            this.inputTextBox = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            this.ok_button.Anchor = (System.Windows.Forms.AnchorStyles.Bottom
 | System.Windows.Forms.AnchorStyles.Right);
            this.ok_button.Location = new System.Drawing.Point(180,
 43);
            this.ok_button.Name = "ok_button";
            this.ok_button.TabIndex = 1;
            this.ok_button.Text = "OK";      
            this.ok_button.DialogResult = System.Windows.Forms.DialogResult.OK;
            
            this.cancel_button.Anchor = (System.Windows.Forms.AnchorStyles.Bottom
 | System.Windows.Forms.AnchorStyles.Right);
            this.cancel_button.Location = new
 System.Drawing.Point(260, 43);
            this.cancel_button.Name = "cancel_button";
            this.cancel_button.TabIndex = 2;
            this.cancel_button.Text = "Cancel";    
        
            this.cancel_button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.inputTextBox.Location = new
 System.Drawing.Point(6, 9);
            this.inputTextBox.Name = "inputTextBox";
            this.inputTextBox.Size = new System.Drawing.Size(327,
 20);
            this.inputTextBox.TabIndex = 0;
            this.inputTextBox.Text = "";           
 
            this.inputTextBox.Anchor = ((System.Windows.Forms.AnchorStyles.Top
 | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.ClientSize = new System.Drawing.Size(342,
 73);
            this.Controls.AddRange(new System.Windows.Forms.Control[]
 {
                                                                          this.inputTextBox
,
                                                                          this.cancel_button
,
                                                                          this.ok_button});
            this.MinimumSize = new System.Drawing.Size(350,
 100);
            this.Name = "StringInputDialog";
            this.Text = "Text Service Provide String Dialog";
            this.ResumeLayout(false);
        }        
    }
}
#using <System.Windows.Forms.dll>
#using <System.dll>
#using <System.Drawing.dll>

using namespace System;
using namespace System::Drawing;
using namespace System::Collections;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::Windows::Forms;
using namespace System::Windows::Forms::Design;

ref class ServiceObjectControl;

// Example form provides UI for demonstrating service sharing behavior
// of a network of IServiceContainer/IServiceProvider controls.
public ref class ServiceForm: public
 System::Windows::Forms::Form
{
private:

   // Root service container control for tree.
   ServiceObjectControl^ root;

   // Button for clearing any provided services and resetting tree states.
   System::Windows::Forms::Button^ reset_button;

   // Color list used to color code controls.
   array<Color>^colorkeys;

   // Strings used to reflect text service.
   array<String^>^keystrings;

public:
   ServiceForm()
   {
      InitializeComponent();
      CreateServiceControlTree();
      colorkeys = gcnew array<Color>(6);
      colorkeys[ 0 ] = Color::Beige;
      colorkeys[ 1 ] = Color::SeaShell;
      colorkeys[ 2 ] = Color::LightGreen;
      colorkeys[ 3 ] = Color::LightBlue;
      colorkeys[ 4 ] = Color::Khaki;
      colorkeys[ 5 ] = Color::CadetBlue;
      array<String^>^stringstemp = {"No service use","Service
 not accessible","Service provided",
            "Service obtained","Service accessible","No
 further access"};
      keystrings = stringstemp;
   }

private:
   void CreateServiceControlTree();
   void InitializeComponent();

internal:
   void ResetServiceTree( Object^ sender, EventArgs^ e );
public:
   void UpdateServiceCoverage();

protected:
   virtual void OnPaint( System::Windows::Forms::PaintEventArgs^
 e ) override;
};

// Example service type contains a text string, sufficient
// to demonstrate service sharing.
public ref class TextService
{
public:
   String^ text;
   TextService()
      : text( String::Empty )
   {}

   TextService( String^ text )
   {
      this->text = text;
   }
};

public enum class TextServiceState
{
   ServiceNotObtained, ServiceObtained, ServiceProvided, ServiceNotFound
};

// Example Form for entering a string.
private ref class StringInputDialog: public
 System::Windows::Forms::Form
{
private:
   System::Windows::Forms::Button^ ok_button;
   System::Windows::Forms::Button^ cancel_button;

public:
   System::Windows::Forms::TextBox^ inputTextBox;
   StringInputDialog( String^ text )
   {
      InitializeComponent();
      inputTextBox->Text = text;
   }

private:
   void InitializeComponent()
   {
      this->ok_button = gcnew System::Windows::Forms::Button;
      this->cancel_button = gcnew System::Windows::Forms::Button;
      this->inputTextBox = gcnew System::Windows::Forms::TextBox;
      this->SuspendLayout();
      this->ok_button->Anchor = static_cast<AnchorStyles>(System::Windows::Forms::AnchorStyles::Bottom
 |
            System::Windows::Forms::AnchorStyles::Right);
      this->ok_button->Location = System::Drawing::Point(
 180, 43 );
      this->ok_button->Name = "ok_button";
      this->ok_button->TabIndex = 1;
      this->ok_button->Text = "OK";
      this->ok_button->DialogResult = System::Windows::Forms::DialogResult::OK;
      this->cancel_button->Anchor = static_cast<AnchorStyles>(System::Windows::Forms::AnchorStyles::Bottom
 |
            System::Windows::Forms::AnchorStyles::Right);
      this->cancel_button->Location = System::Drawing::Point(
 260, 43 );
      this->cancel_button->Name = "cancel_button";
      this->cancel_button->TabIndex = 2;
      this->cancel_button->Text = "Cancel";
      this->cancel_button->DialogResult = System::Windows::Forms::DialogResult::Cancel;
      this->inputTextBox->Location = System::Drawing::Point(
 6, 9 );
      this->inputTextBox->Name = "inputTextBox";
      this->inputTextBox->Size = System::Drawing::Size(
 327, 20 );
      this->inputTextBox->TabIndex = 0;
      this->inputTextBox->Text = "";
      this->inputTextBox->Anchor = static_cast<AnchorStyles>((System::Windows::Forms::AnchorStyles::Top
 |
            System::Windows::Forms::AnchorStyles::Left) | System::Windows::Forms::AnchorStyles::Right);
      this->ClientSize = System::Drawing::Size( 342, 73 );
      array<System::Windows::Forms::Control^>^temp0 = {this->inputTextBox
,this->cancel_button,this->ok_button};
      this->Controls->AddRange( temp0 );
      this->MinimumSize = System::Drawing::Size( 350, 100 );
      this->Name = "StringInputDialog";
      this->Text = "Text Service Provide String Dialog";
      this->ResumeLayout( false );
   }
};


// An example user control that uses ServiceContainer to add, remove
,
// and access services through a linkable service container network.
public ref class ServiceObjectControl: public
 System::Windows::Forms::UserControl
{
public:

   // This example user control implementation provides a wrapper for
   // ServiceContainer, supporting a linked service container network.
   ServiceContainer^ serviceContainer;

private:

   // Parent form reference for main program function access.
   ServiceForm^ parent;

public:

   // String for label displayed on the control to indicate the
   // control's current service-related configuration state.
   String^ label;

private:

   // The current state of the control reflecting whether it has
   // obtained or provided a text service.
   TextServiceState state_;

public:

   property TextServiceState state 
   {
      TextServiceState get()
      {
         return state_;
      }

      void set( TextServiceState value )
      {
         if ( (TextServiceState)value == TextServiceState::ServiceProvided
 )
                  this->BackColor = Color::LightGreen;
         else
         if ( (TextServiceState)value == TextServiceState::ServiceNotObtained
 )
                  this->BackColor = Color::White;
         else
         if ( (TextServiceState)value == TextServiceState::ServiceObtained
 )
                  this->BackColor = Color::LightBlue;
         else
         if ( (TextServiceState)value == TextServiceState::ServiceNotFound
 )
                  this->BackColor = Color::SeaShell;

         state_ = value;
      }
   }
   ServiceObjectControl( ServiceObjectControl^ serviceContainerParent, System::Drawing::Size
 size,
         Point location, ServiceForm^ parent )
   {
      this->state_ = TextServiceState::ServiceNotObtained;
      this->BackColor = Color::Beige;
      this->label = String::Empty;
      this->Size = size;
      this->Location = location;
      this->parent = parent;
      if ( serviceContainerParent == nullptr )
            serviceContainer = gcnew ServiceContainer;
      else
            serviceContainer = gcnew ServiceContainer( serviceContainerParent->serviceContainer
 );
   }

protected:

   // Paint method override draws the label string on the control.
   virtual void OnPaint( System::Windows::Forms::PaintEventArgs^
 e ) override
   {
      e->Graphics->DrawString( label, gcnew System::Drawing::Font( "Arial",8
 ), gcnew SolidBrush( Color::Black ), 5, 5 );
   }

   // Process mouse-down behavior for click.
   virtual void OnMouseDown( System::Windows::Forms::MouseEventArgs^
 e ) override
   {
      if ( e->Button == ::MouseButtons::Left )
      {
         if ( state_ != TextServiceState::ServiceProvided )
         {
            // Attempt to update text from service, and set color
            // state accordingly.
            TextService^ ts = dynamic_cast<TextService^>(serviceContainer->GetService(
 TextService::typeid ));
            if ( ts != nullptr )
            {
               this->label = ts->text;
               state = TextServiceState::ServiceObtained;
            }
            else
            {
               this->label = "Service Not Found";
               state = TextServiceState::ServiceNotFound;
            }
         }
      }

      if ( e->Button == ::MouseButtons::Right )
      {
         if ( state_ == TextServiceState::ServiceProvided )
         {
            // Remove service if the container provided it.
            if ( serviceContainer->GetService( TextService::typeid
 ) != nullptr )
            {
               serviceContainer->RemoveService( TextService::typeid, true
 );
               state = TextServiceState::ServiceNotObtained;
               this->label = "Service Removed";
            }
         }
         else
         {
            // Obtain string and provide text service.
            StringInputDialog^ form = gcnew StringInputDialog( "Test String"
 );
            form->StartPosition = FormStartPosition::CenterParent;
            if ( form->ShowDialog() == DialogResult::OK )
            {
               if ( serviceContainer->GetService( TextService::typeid
 ) != nullptr )
                              serviceContainer->RemoveService( TextService::typeid, true
 );
               parent->ResetServiceTree( this, gcnew EventArgs
 );
               serviceContainer->AddService( TextService::typeid, gcnew TextService(
 form->inputTextBox->Text ), true );
               state = TextServiceState::ServiceProvided;
               this->label = String::Format( "Provided
 Text: {0}", form->inputTextBox->Text );
            }
         }
      }

      parent->UpdateServiceCoverage();
   }

public:

   // Method accesses the TextService to test the visibility of the
 service
   // from the control, and sets the UI state accordingly.
   void ReflectServiceVisibility()
   {
      if ( state_ == TextServiceState::ServiceObtained )
      {
         if ( serviceContainer->GetService( TextService::typeid
 ) == nullptr )
                  this->BackColor = Color::CadetBlue;
      }
      else
      if ( state_ != TextServiceState::ServiceProvided )
      {
         if ( serviceContainer->GetService( TextService::typeid
 ) == nullptr )
         {
            this->BackColor = Color::White;
            return;
         }
         
         // Service available.
         if ( state_ == TextServiceState::ServiceNotFound )
                  this->BackColor = Color::Khaki;
         else
         if ( state_ == TextServiceState::ServiceNotObtained &&
  !label->Equals( "Service Removed" ) )
                  this->BackColor = Color::Khaki;
      }
   }
};

void ServiceForm::CreateServiceControlTree()
{
   // Create root service control.
   ServiceObjectControl^ control1 = gcnew ServiceObjectControl( nullptr,System::Drawing::Size(
 300, 40 ),Point(10,80),this );
   root = control1;

   // Create first tier - pass parent with service object control 1
   ServiceObjectControl^ control2 = gcnew ServiceObjectControl( control1,System::Drawing::Size(
 200, 30 ),Point(50,160),this );
   ServiceObjectControl^ control3 = gcnew ServiceObjectControl( control1,System::Drawing::Size(
 200, 30 ),Point(50,240),this );

   // Create second tier A - pass parent with service object control
 2
   ServiceObjectControl^ control4 = gcnew ServiceObjectControl( control2,System::Drawing::Size(
 180, 20 ),Point(300,145),this );
   ServiceObjectControl^ control5 = gcnew ServiceObjectControl( control2,System::Drawing::Size(
 180, 20 ),Point(300,185),this );

   // Create second tier B - pass parent with service object control
 3
   ServiceObjectControl^ control6 = gcnew ServiceObjectControl( control3,System::Drawing::Size(
 180, 20 ),Point(300,225),this );
   ServiceObjectControl^ control7 = gcnew ServiceObjectControl( control3,System::Drawing::Size(
 180, 20 ),Point(300,265),this );

   // Add controls.
   array<Control^>^temp1 = {control1,control2,control3,control4,control5,control6
,control7};
   this->Controls->AddRange( temp1 );
}

void ServiceForm::ResetServiceTree( Object^ /*sender*/, EventArgs^
 /*e*/ )
{
   // Remove the service from the service tree.
   if ( root->serviceContainer->GetService( TextService::typeid
 ) != nullptr )
      root->serviceContainer->RemoveService( TextService::typeid, true
 );

   // Set all controls to "not obtained" and clear their labels.
   for ( int i = 0; i < Controls->Count;
 i++ )
      if (  !Controls[ i ]->Equals( reset_button ) )
      {
         (dynamic_cast<ServiceObjectControl^>(Controls[ i ]))->state = TextServiceState::ServiceNotObtained;
         (dynamic_cast<ServiceObjectControl^>(Controls[ i ]))->label = String::Empty;
         (dynamic_cast<ServiceObjectControl^>(Controls[ i ]))->BackColor
 = Color::Beige;
      }
}

void ServiceForm::UpdateServiceCoverage()
{
   // Have each control set state to reflect service availability.
   for ( int i = 0; i < Controls->Count;
 i++ )
      if (  !Controls[ i ]->Equals( reset_button ) )
            (dynamic_cast<ServiceObjectControl^>(Controls[ i ]))->ReflectServiceVisibility();
}

void ServiceForm::InitializeComponent()
{
   this->reset_button = gcnew System::Windows::Forms::Button;
   this->SuspendLayout();

   //
   // reset_button
   //
   this->reset_button->Location = System::Drawing::Point(
 392, 88 );
   this->reset_button->Name = "reset_button";
   this->reset_button->TabIndex = 0;
   this->reset_button->TabStop = false;
   this->reset_button->Text = "Reset";
   this->reset_button->Click += gcnew System::EventHandler(
 this, &ServiceForm::ResetServiceTree );

   //
   // ServiceForm
   //
   this->ClientSize = System::Drawing::Size( 512, 373 );
   array<System::Windows::Forms::Control^>^temp2 = {this->reset_button};
   this->Controls->AddRange( temp2 );
   this->MinimumSize = System::Drawing::Size( 520, 400 );
   this->Name = "ServiceForm";
   this->Text = "Service Container Architecture Example";
   this->ResumeLayout( false );
}

void ServiceForm::OnPaint( System::Windows::Forms::PaintEventArgs^
 e )
{
   e->Graphics->DrawString( "The following tree diagram represents a hierarchy
 of linked service containers in controls.",
         gcnew System::Drawing::Font( "Arial",9 ), gcnew SolidBrush( Color::Black
 ), 4, 4 );
   e->Graphics->DrawString( "This example demonstrates the propagation
 behavior of services through a linked service object tree.",
         gcnew System::Drawing::Font( "Arial",8 ), gcnew SolidBrush( Color::Black
 ), 4, 26 );
   e->Graphics->DrawString( "Right-click a component to add or replace
 a text service, or to remove it if the component provided it."
,
         gcnew System::Drawing::Font( "Arial",8 ), gcnew SolidBrush( Color::Black
 ), 4, 38 );
   e->Graphics->DrawString( "Left-click a component to update text from
 the text service if available.",
         gcnew System::Drawing::Font( "Arial",8 ), gcnew SolidBrush( Color::Black
 ), 4, 50 );

   // Draw lines to represent tree branches.
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 20, 125, 20, 258 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 21, 175, 45, 175 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 21, 258, 45, 258 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 255, 175, 285, 175 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 255, 258, 285, 258 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 155, 285, 195 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 238, 285, 278 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 155, 290, 155 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 195, 290, 195 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 238, 290, 238 );
   e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ),
 285, 278, 290, 278 );

   // Draw color key.
   e->Graphics->DrawRectangle( gcnew Pen( gcnew SolidBrush( Color::Black ),1
 ), 20, 305, 410, 60 );
   int y = 0;
   for ( int i = 0; i < 3; i++ )
   {
      e->Graphics->FillRectangle( gcnew SolidBrush( colorkeys[ y ] ), 25 +
 (i * 140), 310, 20, 20 );
      e->Graphics->DrawRectangle( gcnew Pen( gcnew SolidBrush( Color::Black
 ),1 ), 25 + (i * 140), 310, 20, 20 );
      e->Graphics->DrawString( keystrings[ y ], gcnew System::Drawing::Font(
 "Arial",8 ), gcnew SolidBrush( Color::Black ),
            (float)50 + (i * 140), 315 );
      y++;
      e->Graphics->FillRectangle( gcnew SolidBrush( colorkeys[ y ] ), 25 +
 (i * 140), 340, 20, 20 );
      e->Graphics->DrawRectangle( gcnew Pen( gcnew SolidBrush( Color::Black
 ),1 ), 25 + (i * 140), 340, 20, 20 );
      e->Graphics->DrawString( keystrings[ y ], gcnew System::Drawing::Font(
 "Arial",8 ), gcnew SolidBrush( Color::Black ),
            (float)50 + (i * 140), 345 );
      y++;
   }
}

[STAThread]
int main()
{
   Application::Run( gcnew ServiceForm );
}
package ServiceArchitectureExample; 

import System.*;
import System.Drawing.*;
import System.Collections.*;
import System.ComponentModel.*;
import System.ComponentModel.Design.*;
import System.Windows.Forms.*;
import System.Windows.Forms.Design.*;
// Example form provides UI for demonstrating service sharing behavior
 
// of a network of IServiceContainer/IServiceProvider controls.

public class ServiceForm extends System.Windows.Forms.Form
{
    // Root service container control for tree.
    private ServiceObjectControl root;
    // Button for clearing any provided services and resetting tree
 states.
    private System.Windows.Forms.Button resetButton;
    // Color list used to color code controls.
    private Color colorKeys[];
    // Strings used to reflect text service.
    private String keyStrings[];

    public ServiceForm()
    {
        InitializeComponent();
        CreateServiceControlTree();
        colorKeys = new Color[] { Color.get_Beige(), Color.get_SeaShell()
,
            Color.get_LightGreen(), Color.get_LightBlue(), Color.get_Khaki(), 
            Color.get_CadetBlue() };
        keyStrings = new String[] { "No service use",
 "Service not accessible",
            "Service provided", "Service obtained", "Service
 accessible",
            "No further access" };
    } //ServiceForm

    private void CreateServiceControlTree()
    {
        // Create root service control.
        ServiceObjectControl control1 = new ServiceObjectControl(null,
 
            new Size(300, 40), new Point(10,
 80), this);
        root = control1;
        // Create first tier - pass parent with service object control
 1
        ServiceObjectControl control2 = new ServiceObjectControl(control1
,
            new Size(200, 30), new Point(50,
 160), this);
        ServiceObjectControl control3 = new ServiceObjectControl(control1
,
            new Size(200, 30), new Point(50,
 240), this);
        // Create second tier A - pass parent with service object control
 2
        ServiceObjectControl control4 = new ServiceObjectControl(control2
,
            new Size(180, 20), new Point(300,
 145), this);
        ServiceObjectControl control5 = new ServiceObjectControl(control2,
 
            new Size(180, 20), new Point(300,
 185), this);
        // Create second tier B - pass parent with service object control
 3
        ServiceObjectControl control6 = new ServiceObjectControl(control3
,
            new Size(180, 20), new Point(300,
 225), this);
        ServiceObjectControl control7 = new ServiceObjectControl(control3,
 
            new Size(180, 20), new Point(300,
 265), this);
        // Add controls.
        this.get_Controls().AddRange(new Control[]
 { control1, control2, 
            control3, control4, control5, control6, control7 });
    } //CreateServiceControlTree

    public void ResetServiceTree(Object sender,
 EventArgs e)
    {
        // Remove the service from the service tree.
        if (root.serviceContainer.GetService(TextService.class.ToType())
 != null) {
            root.serviceContainer.RemoveService(TextService.class.ToType(),
 true);
        }
        // Set all controls to "not obtained" and clear their
 labels.
        for (int i = 0; i < get_Controls().get_Count();
 i++) {
            if (!(get_Controls().get_Item(i).Equals(resetButton)))
 {
                ((ServiceObjectControl)(get_Controls().get_Item(i))).set_state(
                    TextServiceState.ServiceNotObtained);
                ((ServiceObjectControl)(get_Controls().get_Item(i))).label = "";
                ((ServiceObjectControl)(get_Controls().get_Item(i))).
                    set_BackColor(Color.get_Beige());
            }
        }
    } //ResetServiceTree

    public void UpdateServiceCoverage()
    {
        // Have each control set state to reflect service availability.
        for (int i = 0; i < get_Controls().get_Count();
 i++) {
            if (!(get_Controls().get_Item(i).Equals(resetButton)))
 {
                ((ServiceObjectControl)(get_Controls().get_Item(i))).
                    ReflectServiceVisibility();
            }
        }
    } //UpdateServiceCoverage

    #region Windows Form Designer generated code
    private void InitializeComponent()
    {
        this.resetButton = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // resetButton
        // 
        this.resetButton.set_Location(new System.Drawing.Point(392,
 88));
        this.resetButton.set_Name("resetButton");
        this.resetButton.set_TabIndex(0);
        this.resetButton.set_TabStop(false);
        this.resetButton.set_Text("Reset");
        this.resetButton.add_Click(new System.EventHandler(this.ResetServiceTree));
        // 
        // ServiceForm
        // 
        this.set_ClientSize(new System.Drawing.Size(512,
 373));
        this.get_Controls().AddRange(new System.Windows.Forms.Control[]
 { this.
            resetButton });
        this.set_MinimumSize(new System.Drawing.Size(520,
 400));
        this.set_Name("ServiceForm");
        this.set_Text("Service Container Architecture Example");
        this.ResumeLayout(false);
    } //InitializeComponent
    #endregion

    /** @attribute STAThread()
     */
    public static void main(String[]
 args)
    {
        Application.Run(new ServiceForm());
    } //main

    protected void OnPaint(System.Windows.Forms.PaintEventArgs
 e)
    {
        e.get_Graphics().DrawString("The following tree diagram represents a
 "
            + "hierarchy of linked service containers in
 controls.", new Font(
            "Arial", 9), new SolidBrush(Color.get_Black()),
 4, 4);
        e.get_Graphics().DrawString("This example demonstrates the propagation"
            + "behavior of services through a linked service object tree.",
 
            new Font("Arial", 8), new
 SolidBrush(Color.get_Black()), 4, 26);
        e.get_Graphics().DrawString("Right-click a component to add or replace"
            + "a text service, or to remove it if the component
 provided it.", 
            new Font("Arial", 8), new
 SolidBrush(Color.get_Black()), 4, 38);
        e.get_Graphics().DrawString("Left-click a component to update text from"
            + "the text service if available.", new
 Font("Arial", 8), 
            new SolidBrush(Color.get_Black()), 4, 50);
        // Draw lines to represent tree branches.
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            20, 125, 20, 258);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            21, 175, 45, 175);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            21, 258, 45, 258);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            255, 175, 285, 175);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            255, 258, 285, 258);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            285, 155, 285, 195);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            285, 238, 285, 278);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            285, 155, 290, 155);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1),
            285, 195, 290, 195);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1), 
            285, 238, 290, 238);
        e.get_Graphics().DrawLine(new Pen(new
 SolidBrush(Color.get_Black()), 1), 
            285, 278, 290, 278);
        // Draw color key.
        e.get_Graphics().DrawRectangle(new Pen(new
 SolidBrush(Color.get_Black()),
            1), 20, 305, 410, 60);
        int y = 0;
        for (int i = 0; i < 3; i++) {
            e.get_Graphics().FillRectangle(new SolidBrush((Color)colorKeys.
                get_Item(y)), 25 + i * 140, 310, 20, 20);
            e.get_Graphics().DrawRectangle(new Pen(new
 SolidBrush(Color.
                get_Black()), 1), 25 + i * 140, 310, 20, 20);
            e.get_Graphics().DrawString((String)keyStrings.get_Item(y), 
                new Font("Arial", 8), new
 SolidBrush(Color.get_Black()),
                (float)(50 + i * 140), 315f);
            y++;
            e.get_Graphics().FillRectangle(new SolidBrush((Color)colorKeys.
                get_Item(y)), 25 + i * 140, 340, 20, 20);
            e.get_Graphics().DrawRectangle(new Pen(new
 SolidBrush(Color.
                get_Black()), 1), 25 + i * 140, 340, 20, 20);
            e.get_Graphics().DrawString((String)keyStrings.get_Item(y),
                new Font("Arial", 8), new
 SolidBrush(Color.get_Black()), (float)(
                50 + i * 140), 345f);
            y++;
        }
    } //OnPaint
} //ServiceForm

// An example user control that uses ServiceContainer to add, remove
,
// and access services through a linkable service container network.
public class ServiceObjectControl extends System.Windows.Forms.UserControl
{
    // This example user control implementation provides a wrapper for
 
    // ServiceContainer, supporting a linked service container network.
    
    public ServiceContainer serviceContainer;
    // Parent form reference for main program function access.
    private ServiceForm parent;
    // String for label displayed on the control to indicate the 
    // control's current service-related configuration state.
    public String label;
    // The current state of the control reflecting whether it has 
    // obtained or provided a text service.
    private int state_;
    /** @property 
     */
    public int get_state()
    {
        return state_;
    }//get_state

    /** @property
     */
    public void set_state(int
 value)
    {
        if (value == TextServiceState.ServiceProvided) {
            this.set_BackColor(Color.get_LightGreen());
        }
        else {
            if (value == TextServiceState.ServiceNotObtained)
 {
                this.set_BackColor(Color.get_White());
            }
            else {
                if (value == TextServiceState.ServiceObtained)
 {
                    this.set_BackColor(Color.get_LightBlue());
                } 
                else {
                    if (value == TextServiceState.ServiceNotFound)
 {
                        this.set_BackColor(Color.get_SeaShell());
                    }
                }
            }
        }
        state_ = value;
    }//set_state

    public ServiceObjectControl(ServiceObjectControl serviceContainerParent
,
        Size size, Point location, ServiceForm parent)
    {
        this.state_ = TextServiceState.ServiceNotObtained;
        this.set_BackColor(Color.get_Beige());
        this.label = String.Empty;
        this.set_Size(size);
        this.set_Location(location);
        this.parent = parent;
        if (serviceContainerParent == null)
 {
            serviceContainer = new ServiceContainer();
        }
        else {
            serviceContainer = new ServiceContainer(serviceContainerParent.
                serviceContainer);
        }
    } //ServiceObjectControl

    // Paint method override draws the label string on the control.
    protected void OnPaint(System.Windows.Forms.PaintEventArgs
 e)
    {
        e.get_Graphics().DrawString(label, new Font("Arial",
 8), new SolidBrush(
            Color.get_Black()), 5, 5);
    } //OnPaint

    // Process mouse-down behavior for click.
    protected void OnMouseDown(System.Windows.Forms.MouseEventArgs
 e)
    {
        if (e.get_Button().Equals(get_MouseButtons().Left)) {
            if (state_ != TextServiceState.ServiceProvided) {
                // Attempt to update text from service, and set color
 
                // state accordingly.
                TextService ts = (TextService)(serviceContainer.GetService(
                    TextService.class.ToType()));
                if (ts != null) {
                    this.label = ts.text;
                    set_state(TextServiceState.ServiceObtained);
                }
                else {
                    this.label = "Service Not Found";
                    set_state(TextServiceState.ServiceNotFound);
                }
            }
        }
        if (e.get_Button().Equals(get_MouseButtons().Right)) {
            if (state_ == TextServiceState.ServiceProvided) {
                // Remove service if the container provided it.
                if (serviceContainer.GetService(TextService.class.
                    ToType()) != null) {
                    serviceContainer.RemoveService(TextService.class.ToType()
,
                        true);
                    set_state(TextServiceState.ServiceNotObtained);
                    this.label = "Service Removed";
                }
            }
            else {
                // Obtain string and provide text service.
                StringInputDialog form = new StringInputDialog("Test
 String");
                form.set_StartPosition(FormStartPosition.CenterParent);
                if (form.ShowDialog().Equals(DialogResult.OK))
 {
                    if (serviceContainer.GetService(TextService.class.
                        ToType()) != null) {
                        serviceContainer.RemoveService(TextService.class.
                            ToType(), true);
                    }
                    parent.ResetServiceTree(this, new
 EventArgs());
                    serviceContainer.AddService(TextService.class.ToType()
,
                        new TextService(form.inputTextBox.get_Text()),
 true);
                    set_state(TextServiceState.ServiceProvided);
                    this.label = "Provided Text: " +
 form.inputTextBox.get_Text();
                }
            }
        }
        parent.UpdateServiceCoverage();
    } //OnMouseDown

    // Method accesses the TextService to test the visibility of the
 service 
    // from the control, and sets the UI state accordingly.
    public void ReflectServiceVisibility()
    {
        if (state_ == TextServiceState.ServiceObtained) {
            if (serviceContainer.GetService(TextService.class.ToType())
 == null) {
                this.set_BackColor(Color.get_CadetBlue());
            }
        }
        else {
            if (state_ != TextServiceState.ServiceProvided) {
                if (serviceContainer.GetService(TextService.class.
                    ToType()) == null) {
                    this.set_BackColor(Color.get_White());
                    return;
                }
                // Service available.                  
                if (state_ == TextServiceState.ServiceNotFound)
 {
                    this.set_BackColor(Color.get_Khaki());
                }
                else {
                    if (state_ == TextServiceState.
                        ServiceNotObtained && label != "Service Removed")
 {
                        this.set_BackColor(Color.get_Khaki());
                    }
                }
            }
        }
    } //ReflectServiceVisibility
} //ServiceObjectControl

// Example service type contains a text string, sufficient 
// to demonstrate service sharing.
public class TextService
{
    public String text;

    public TextService()
    {
         this("");
    } //TextService
    public TextService(String text)
    {
        this.text = text;
    } //TextService
} //TextService

public class TextServiceState
{
    private int member;

    TextServiceState()
    {
        member = 0;
    }// TextServiceState

    TextServiceState(int n)
    {
        member = n;
    }//TextServiceState

    public static int ServiceNotObtained
 = 0;
    public static int ServiceObtained
 = 1;
    public static int ServiceProvided
 = 2;
    public static int ServiceNotFound
 = 3;
} //TextServiceState

// Example Form for entering a string.
class StringInputDialog extends System.Windows.Forms.Form
{
    private System.Windows.Forms.Button okButton;
    private System.Windows.Forms.Button cancelButton;
    public System.Windows.Forms.TextBox inputTextBox;

    public StringInputDialog(String text)
    {
        InitializeComponent();
        inputTextBox.set_Text(text);
    } //StringInputDialog

    private void InitializeComponent()
    {
        this.okButton = new System.Windows.Forms.Button();
        this.cancelButton = new System.Windows.Forms.Button();
        this.inputTextBox = new System.Windows.Forms.TextBox();
        this.SuspendLayout();
        this.okButton.set_Anchor(System.Windows.Forms.AnchorStyles.Bottom
 
            | System.Windows.Forms.AnchorStyles.Right);
        this.okButton.set_Location(new System.Drawing.Point(180,
 43));
        this.okButton.set_Name("okButton");
        this.okButton.set_TabIndex(1);
        this.okButton.set_Text("OK");
        this.okButton.set_DialogResult(System.Windows.Forms.DialogResult.OK);
        this.cancelButton.set_Anchor(System.Windows.Forms.AnchorStyles.
            Bottom | System.Windows.Forms.AnchorStyles.Right);
        this.cancelButton.set_Location(new
 System.Drawing.Point(260, 43));
        this.cancelButton.set_Name("cancelButton");
        this.cancelButton.set_TabIndex(2);
        this.cancelButton.set_Text("Cancel");
        this.cancelButton.set_DialogResult(System.Windows.Forms.DialogResult.
            Cancel);
        this.inputTextBox.set_Location(new
 System.Drawing.Point(6, 9));
        this.inputTextBox.set_Name("inputTextBox");
        this.inputTextBox.set_Size(new System.Drawing.Size(327,
 20));
        this.inputTextBox.set_TabIndex(0);
        this.inputTextBox.set_Text("");
        this.inputTextBox.set_Anchor(System.Windows.Forms.AnchorStyles.
            Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.
            AnchorStyles.Right);
        this.set_ClientSize(new System.Drawing.Size(342,
 73));
        this.get_Controls().AddRange(new System.Windows.Forms.Control[]
 { this.
            inputTextBox, this.cancelButton, this.okButton
 });
        this.set_MinimumSize(new System.Drawing.Size(350,
 100));
        this.set_Name("StringInputDialog");
        this.set_Text("Text Service Provide String Dialog");
        this.ResumeLayout(false);
    } //InitializeComponent
} //StringInputDialog
継承階層継承階層
System.Object
  System.ComponentModel.Design.ServiceContainer
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバ場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
ServiceContainer メンバ
System.ComponentModel.Design 名前空間
IServiceProvider
IServiceContainer インターフェイス
ServiceCreatorCallback

ServiceContainer コンストラクタ ()


ServiceContainer コンストラクタ (IServiceProvider)

サービス プロバイダ指定して、ServiceContainer クラス新しインスタンス初期化します。

名前空間: System.ComponentModel.Design
アセンブリ: System (system.dll 内)
構文構文

Public Sub New ( _
    parentProvider As IServiceProvider _
)
Dim parentProvider As IServiceProvider

Dim instance As New ServiceContainer(parentProvider)
public ServiceContainer (
    IServiceProvider parentProvider
)
public:
ServiceContainer (
    IServiceProvider^ parentProvider
)
public ServiceContainer (
    IServiceProvider parentProvider
)
public function ServiceContainer (
    parentProvider : IServiceProvider
)

パラメータ

parentProvider

サービス プロバイダ

解説解説
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
ServiceContainer クラス
ServiceContainer メンバ
System.ComponentModel.Design 名前空間

ServiceContainer コンストラクタ

ServiceContainer クラス新しインスタンス初期化します。
オーバーロードの一覧オーバーロードの一覧

名前 説明
ServiceContainer () ServiceContainer クラス新しインスタンス初期化します。
ServiceContainer (IServiceProvider) サービス プロバイダ指定してServiceContainer クラス新しインスタンス初期化します。
参照参照

関連項目

ServiceContainer クラス
ServiceContainer メンバ
System.ComponentModel.Design 名前空間

ServiceContainer プロパティ


プロテクト プロパティプロテクト プロパティ

  名前 説明
プロテクト プロパティ DefaultServices ServiceContainer によって直接実装されている既定サービス取得します
参照参照

関連項目

ServiceContainer クラス
System.ComponentModel.Design 名前空間
IServiceProvider
IServiceContainer インターフェイス
ServiceCreatorCallback

ServiceContainer メソッド


パブリック メソッドパブリック メソッド

プロテクト メソッドプロテクト メソッド
参照参照

関連項目

ServiceContainer クラス
System.ComponentModel.Design 名前空間
IServiceProvider
IServiceContainer インターフェイス
ServiceCreatorCallback

ServiceContainer メンバ

IServiceContainer インターフェイス単純な実装提供します。このクラス継承できません。

ServiceContainer データ型公開されるメンバを以下の表に示します


パブリック コンストラクタパブリック コンストラクタ
プロテクト プロパティプロテクト プロパティ
  名前 説明
プロテクト プロパティ DefaultServices ServiceContainer によって直接実装されている既定サービス取得します
パブリック メソッドパブリック メソッド
プロテクト メソッドプロテクト メソッド
参照参照

関連項目

ServiceContainer クラス
System.ComponentModel.Design 名前空間
IServiceProvider
IServiceContainer インターフェイス
ServiceCreatorCallback


このページでは「.NET Framework クラス ライブラリ リファレンス」からServiceContainerを検索した結果を表示しています。
Weblioに収録されているすべての辞書からServiceContainerを検索する場合は、下記のリンクをクリックしてください。
 全ての辞書からServiceContainerを検索

英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ServiceContainer」の関連用語

ServiceContainerのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ServiceContainerのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS