'------------------------------------------------------------------------------
' <auto-generated>
'     Este código fue generado por una herramienta.
'     Versión de runtime:4.0.30319.544
'
'     Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si
'     se vuelve a generar el código.
' </auto-generated>
'------------------------------------------------------------------------------

Option Compare Binary
Option Infer On
Option Strict On
Option Explicit On

Imports ApNegociosSL
Imports ApNegociosSL.Web
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.Linq
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.DomainServices
Imports System.ServiceModel.DomainServices.Client
Imports System.ServiceModel.DomainServices.Client.ApplicationServices
Imports System.ServiceModel.Web


''' <summary>
''' Contexto de la aplicación RIA.
''' </summary>
''' <remarks>
''' Este contexto extiende la base para poner los servicios de la aplicación y los tipos a disposición
''' del código y el xaml.
''' </remarks>
Partial Public NotInheritable Class WebContext
    Inherits WebContextBase
    
    #Region "Definiciones de método de extensibilidad"

    ''' <summary>
    ''' Este método se invoca desde el constructor una vez completada la inicialización y
    ''' se puede utilizar para configurar más objetos.
    ''' </summary>
    Private Partial Sub OnCreated()
    End Sub

    #End Region
    
    
    ''' <summary>
    ''' Inicializa una nueva instancia de la clase WebContext.
    ''' </summary>
    Public Sub New()
        MyBase.New
        Me.OnCreated
    End Sub
    
    ''' <summary>
    ''' Obtiene el contexto registrado como un objeto de vigencia con la aplicación actual.
    ''' </summary>
    ''' Si no hay ninguna aplicación actual, se produce una <exception cref="InvalidOperationException">;
    ''' también si no se ha agregado contexto o si se ha agregado más de un contexto.
    ''' </exception>
    ''' <seealso cref="System.Windows.Application.ApplicationLifetimeObjects"/>
    Public Shadows Shared ReadOnly Property Current() As WebContext
        Get
            Return CType(WebContextBase.Current,WebContext)
        End Get
    End Property
    
    ''' <summary>
    ''' Obtiene un usuario que representa la identidad autenticada.
    ''' </summary>
    Public Shadows ReadOnly Property User() As User
        Get
            Return CType(MyBase.User,User)
        End Get
    End Property
End Class

Namespace Web
    
    ''' <summary>
    ''' DomainContext correspondiente al DomainService 'AuthenticationService'.
    ''' </summary>
    Partial Public NotInheritable Class AuthenticationContext
        Inherits Global.System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationDomainContextBase
        
        #Region "Definiciones de método de extensibilidad"

        ''' <summary>
        ''' Este método se invoca desde el constructor una vez completada la inicialización y
        ''' se puede utilizar para configurar más objetos.
        ''' </summary>
        Private Partial Sub OnCreated()
        End Sub

        #End Region
        
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="AuthenticationContext"/>.
        ''' </summary>
        Public Sub New()
            Me.New(New WebDomainClient(Of IAuthenticationServiceContract)(New Uri("ApNegociosSL-Web-AuthenticationService.svc", UriKind.Relative)))
        End Sub
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="AuthenticationContext"/> con el URI del servicio especificado.
        ''' </summary>
        ''' <param name="serviceUri">URI del servicio AuthenticationService.</param>
        Public Sub New(ByVal serviceUri As Uri)
            Me.New(New WebDomainClient(Of IAuthenticationServiceContract)(serviceUri))
        End Sub
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="AuthenticationContext"/> con el <paramref name="domainClient"/> especificado.
        ''' </summary>
        ''' <param name="domainClient">Instancia de DomainClient que se va a utilizar para este DomainContext.</param>
        Public Sub New(ByVal domainClient As DomainClient)
            MyBase.New(domainClient)
            Me.OnCreated
        End Sub
        
        ''' <summary>
        ''' Obtiene el conjunto de instancias de la entidad <see cref="User"/> que se han cargado en esta instancia <see cref="AuthenticationContext"/>.
        ''' </summary>
        Public ReadOnly Property Users() As EntitySet(Of User)
            Get
                Return MyBase.EntityContainer.GetEntitySet(Of User)
            End Get
        End Property
        
        ''' <summary>
        ''' Obtiene una instancia de EntityQuery que se puede utilizar para cargar instancias de la entidad <see cref="User"/> mediante la consulta 'GetUser'.
        ''' </summary>
        ''' <returns>EntityQuery que se puede cargar para recuperar instancias de la entidad <see cref="User"/>.</returns>
        Public Function GetUserQuery() As EntityQuery(Of User)
            Me.ValidateMethod("GetUserQuery", Nothing)
            Return MyBase.CreateQuery(Of User)("GetUser", Nothing, false, false)
        End Function
        
        ''' <summary>
        ''' Obtiene una instancia de EntityQuery que se puede utilizar para cargar instancias de la entidad <see cref="User"/> mediante la consulta 'Login'.
        ''' </summary>
        ''' <param name="userName">Valor del parámetro 'userName' de la consulta.</param>
        ''' <param name="password">Valor del parámetro 'password' de la consulta.</param>
        ''' <param name="isPersistent">Valor del parámetro 'isPersistent' de la consulta.</param>
        ''' <param name="customData">Valor del parámetro 'customData' de la consulta.</param>
        ''' <returns>EntityQuery que se puede cargar para recuperar instancias de la entidad <see cref="User"/>.</returns>
        Public Function LoginQuery(ByVal userName As String, ByVal password As String, ByVal isPersistent As Boolean, ByVal customData As String) As EntityQuery(Of User)
            Dim parameters As Dictionary(Of String, Object) = New Dictionary(Of String, Object)()
            parameters.Add("userName", userName)
            parameters.Add("password", password)
            parameters.Add("isPersistent", isPersistent)
            parameters.Add("customData", customData)
            Me.ValidateMethod("LoginQuery", parameters)
            Return MyBase.CreateQuery(Of User)("Login", parameters, true, false)
        End Function
        
        ''' <summary>
        ''' Obtiene una instancia de EntityQuery que se puede utilizar para cargar instancias de la entidad <see cref="User"/> mediante la consulta 'Logout'.
        ''' </summary>
        ''' <returns>EntityQuery que se puede cargar para recuperar instancias de la entidad <see cref="User"/>.</returns>
        Public Function LogoutQuery() As EntityQuery(Of User)
            Me.ValidateMethod("LogoutQuery", Nothing)
            Return MyBase.CreateQuery(Of User)("Logout", Nothing, true, false)
        End Function
        
        ''' <summary>
        ''' Crea un nuevo EntityContainer para los EntitySets de este DomainContext.
        ''' </summary>
        ''' <returns>Nueva instancia de contenedor.</returns>
        Protected Overrides Function CreateEntityContainer() As EntityContainer
            Return New AuthenticationContextEntityContainer()
        End Function
        
        ''' <summary>
        ''' Contrato de la clase Service para el DomainService 'AuthenticationService'.
        ''' </summary>
        <ServiceContract()>  _
        Public Interface IAuthenticationServiceContract
            
            ''' <summary>
            ''' Invoca de manera asincrónica la operación 'GetUser'.
            ''' </summary>
            ''' <param name="callback">Devolución de llamada que se va a invocar al completar.</param>
            ''' <param name="asyncState">Objecto de estado opcional.</param>
            ''' <returns>IAsyncResult que se puede utilizar para supervisar la solicitud.</returns>
            <FaultContract(GetType(DomainServiceFault), Action:="http://tempuri.org/AuthenticationService/GetUserDomainServiceFault", Name:="DomainServiceFault", [Namespace]:="DomainServices"),  _
             OperationContract(AsyncPattern:=true, Action:="http://tempuri.org/AuthenticationService/GetUser", ReplyAction:="http://tempuri.org/AuthenticationService/GetUserResponse"),  _
             WebGet()>  _
            Function BeginGetUser(ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
            
            ''' <summary>
            ''' Completa la operación asincrónica iniciada por 'BeginGetUser'.
            ''' </summary>
            ''' <param name="result">IAsyncResult devuelto desde 'BeginGetUser'.</param>
            ''' <returns>'QueryResult' devuelto desde la operación 'GetUser'.</returns>
            Function EndGetUser(ByVal result As IAsyncResult) As QueryResult(Of User)
            
            ''' <summary>
            ''' Invoca de manera asincrónica la operación 'Login'.
            ''' </summary>
            ''' <param name="userName">Valor del parámetro 'userName' de esta acción.</param>
            ''' <param name="password">Valor del parámetro 'password' de esta acción.</param>
            ''' <param name="isPersistent">Valor del parámetro 'isPersistent' de esta acción.</param>
            ''' <param name="customData">Valor del parámetro 'customData' de esta acción.</param>
            ''' <param name="callback">Devolución de llamada que se va a invocar al completar.</param>
            ''' <param name="asyncState">Objecto de estado opcional.</param>
            ''' <returns>IAsyncResult que se puede utilizar para supervisar la solicitud.</returns>
            <FaultContract(GetType(DomainServiceFault), Action:="http://tempuri.org/AuthenticationService/LoginDomainServiceFault", Name:="DomainServiceFault", [Namespace]:="DomainServices"),  _
             OperationContract(AsyncPattern:=true, Action:="http://tempuri.org/AuthenticationService/Login", ReplyAction:="http://tempuri.org/AuthenticationService/LoginResponse")>  _
            Function BeginLogin(ByVal userName As String, ByVal password As String, ByVal isPersistent As Boolean, ByVal customData As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
            
            ''' <summary>
            ''' Completa la operación asincrónica iniciada por 'BeginLogin'.
            ''' </summary>
            ''' <param name="result">IAsyncResult devuelto desde 'BeginLogin'.</param>
            ''' <returns>'QueryResult' devuelto desde la operación 'Login'.</returns>
            Function EndLogin(ByVal result As IAsyncResult) As QueryResult(Of User)
            
            ''' <summary>
            ''' Invoca de manera asincrónica la operación 'Logout'.
            ''' </summary>
            ''' <param name="callback">Devolución de llamada que se va a invocar al completar.</param>
            ''' <param name="asyncState">Objecto de estado opcional.</param>
            ''' <returns>IAsyncResult que se puede utilizar para supervisar la solicitud.</returns>
            <FaultContract(GetType(DomainServiceFault), Action:="http://tempuri.org/AuthenticationService/LogoutDomainServiceFault", Name:="DomainServiceFault", [Namespace]:="DomainServices"),  _
             OperationContract(AsyncPattern:=true, Action:="http://tempuri.org/AuthenticationService/Logout", ReplyAction:="http://tempuri.org/AuthenticationService/LogoutResponse")>  _
            Function BeginLogout(ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
            
            ''' <summary>
            ''' Completa la operación asincrónica iniciada por 'BeginLogout'.
            ''' </summary>
            ''' <param name="result">IAsyncResult devuelto desde 'BeginLogout'.</param>
            ''' <returns>'QueryResult' devuelto desde la operación 'Logout'.</returns>
            Function EndLogout(ByVal result As IAsyncResult) As QueryResult(Of User)
            
            ''' <summary>
            ''' Invoca de manera asincrónica la operación 'SubmitChanges'.
            ''' </summary>
            ''' <param name="changeSet">Conjunto de cambios que se va a enviar.</param>
            ''' <param name="callback">Devolución de llamada que se va a invocar al completar.</param>
            ''' <param name="asyncState">Objecto de estado opcional.</param>
            ''' <returns>IAsyncResult que se puede utilizar para supervisar la solicitud.</returns>
            <FaultContract(GetType(DomainServiceFault), Action:="http://tempuri.org/AuthenticationService/SubmitChangesDomainServiceFault", Name:="DomainServiceFault", [Namespace]:="DomainServices"),  _
             OperationContract(AsyncPattern:=true, Action:="http://tempuri.org/AuthenticationService/SubmitChanges", ReplyAction:="http://tempuri.org/AuthenticationService/SubmitChangesResponse")>  _
            Function BeginSubmitChanges(ByVal changeSet As IEnumerable(Of ChangeSetEntry), ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
            
            ''' <summary>
            ''' Completa la operación asincrónica iniciada por 'BeginSubmitChanges'.
            ''' </summary>
            ''' <param name="result">IAsyncResult devuelto desde 'BeginSubmitChanges'.</param>
            ''' <returns>Colección de elementos de entrada del conjunto de cambios devuelta desde 'SubmitChanges'.</returns>
            Function EndSubmitChanges(ByVal result As IAsyncResult) As IEnumerable(Of ChangeSetEntry)
        End Interface
        
        Friend NotInheritable Class AuthenticationContextEntityContainer
            Inherits EntityContainer
            
            Public Sub New()
                MyBase.New
                Me.CreateEntitySet(Of User)(EntitySetOperations.Edit)
            End Sub
        End Class
    End Class
    
    Public Enum CreateUserStatus
        
        Success = 0
        
        InvalidUserName = 1
        
        InvalidPassword = 2
        
        InvalidQuestion = 3
        
        InvalidAnswer = 4
        
        InvalidEmail = 5
        
        DuplicateUserName = 6
        
        DuplicateEmail = 7
        
        Failure = 8
    End Enum
    
    ''' <summary>
    ''' La clase 'RegistrationData'.
    ''' </summary>
    <DataContract([Namespace]:="http://schemas.datacontract.org/2004/07/ApNegociosSL.Web")>  _
    Partial Public NotInheritable Class RegistrationData
        Inherits ComplexObject
        
        Private _answer As String
        
        Private _email As String
        
        Private _friendlyName As String
        
        Private _question As String
        
        Private _userName As String
        
        #Region "Definiciones de método de extensibilidad"

        ''' <summary>
        ''' Este método se invoca desde el constructor una vez completada la inicialización y
        ''' se puede utilizar para configurar más objetos.
        ''' </summary>
        Private Partial Sub OnCreated()
        End Sub
        Private Partial Sub OnAnswerChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnAnswerChanged()
        End Sub
        Private Partial Sub OnEmailChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnEmailChanged()
        End Sub
        Private Partial Sub OnFriendlyNameChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnFriendlyNameChanged()
        End Sub
        Private Partial Sub OnQuestionChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnQuestionChanged()
        End Sub
        Private Partial Sub OnUserNameChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnUserNameChanged()
        End Sub

        #End Region
        
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="RegistrationData"/>.
        ''' </summary>
        Public Sub New()
            MyBase.New
            Me.OnCreated
        End Sub
        
        ''' <summary>
        ''' Obtiene o establece el valor 'Answer'.
        ''' </summary>
        <DataMember(),  _
         Display(Name:="SecurityAnswerLabel", Order:=6, ResourceType:=GetType(RegistrationDataResources)),  _
         Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources)),  _
         StringLength(128, ErrorMessageResourceName:="ValidationErrorBadAnswerLength", ErrorMessageResourceType:=GetType(ValidationErrorResources))>  _
        Public Property Answer() As String
            Get
                Return Me._answer
            End Get
            Set
                If (String.Equals(Me._answer, value) = false) Then
                    Me.OnAnswerChanging(value)
                    Me.RaiseDataMemberChanging("Answer")
                    Me.ValidateProperty("Answer", value)
                    Me._answer = value
                    Me.RaiseDataMemberChanged("Answer")
                    Me.OnAnswerChanged
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'Email'.
        ''' </summary>
        <DataMember(),  _
         Display(Name:="EmailLabel", Order:=2, ResourceType:=GetType(RegistrationDataResources)),  _
         RegularExpression("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4"& _ 
            "}|[0-9]{1,3})(\]?)$", ErrorMessageResourceName:="ValidationErrorInvalidEmail", ErrorMessageResourceType:=GetType(ValidationErrorResources)),  _
         Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources))>  _
        Public Property Email() As String
            Get
                Return Me._email
            End Get
            Set
                If (String.Equals(Me._email, value) = false) Then
                    Me.OnEmailChanging(value)
                    Me.RaiseDataMemberChanging("Email")
                    Me.ValidateProperty("Email", value)
                    Me._email = value
                    Me.RaiseDataMemberChanged("Email")
                    Me.OnEmailChanged
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'FriendlyName'.
        ''' </summary>
        <DataMember(),  _
         Display(Description:="FriendlyNameDescription", Name:="FriendlyNameLabel", Order:=1, ResourceType:=GetType(RegistrationDataResources)),  _
         StringLength(255, ErrorMessageResourceName:="ValidationErrorBadFriendlyNameLength", ErrorMessageResourceType:=GetType(ValidationErrorResources))>  _
        Public Property FriendlyName() As String
            Get
                Return Me._friendlyName
            End Get
            Set
                If (String.Equals(Me._friendlyName, value) = false) Then
                    Me.OnFriendlyNameChanging(value)
                    Me.RaiseDataMemberChanging("FriendlyName")
                    Me.ValidateProperty("FriendlyName", value)
                    Me._friendlyName = value
                    Me.RaiseDataMemberChanged("FriendlyName")
                    Me.OnFriendlyNameChanged
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'Question'.
        ''' </summary>
        <DataMember(),  _
         Display(Name:="SecurityQuestionLabel", Order:=5, ResourceType:=GetType(RegistrationDataResources)),  _
         Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources))>  _
        Public Property Question() As String
            Get
                Return Me._question
            End Get
            Set
                If (String.Equals(Me._question, value) = false) Then
                    Me.OnQuestionChanging(value)
                    Me.RaiseDataMemberChanging("Question")
                    Me.ValidateProperty("Question", value)
                    Me._question = value
                    Me.RaiseDataMemberChanged("Question")
                    Me.OnQuestionChanged
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'UserName'.
        ''' </summary>
        <DataMember(),  _
         Display(Name:="UserNameLabel", Order:=0, ResourceType:=GetType(RegistrationDataResources)),  _
         RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName:="ValidationErrorInvalidUserName", ErrorMessageResourceType:=GetType(ValidationErrorResources)),  _
         Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources)),  _
         StringLength(255, ErrorMessageResourceName:="ValidationErrorBadUserNameLength", ErrorMessageResourceType:=GetType(ValidationErrorResources), MinimumLength:=4)>  _
        Public Property UserName() As String
            Get
                Return Me._userName
            End Get
            Set
                If (String.Equals(Me._userName, value) = false) Then
                    Me.OnUserNameChanging(value)
                    Me.RaiseDataMemberChanging("UserName")
                    Me.ValidateProperty("UserName", value)
                    Me._userName = value
                    Me.RaiseDataMemberChanged("UserName")
                    Me.OnUserNameChanged
                End If
            End Set
        End Property
    End Class
    
    ''' <summary>
    ''' Clase de entidad 'User'.
    ''' </summary>
    <DataContract([Namespace]:="http://schemas.datacontract.org/2004/07/ApNegociosSL.Web")>  _
    Partial Public NotInheritable Class User
        Inherits Entity
        Implements Global.System.Security.Principal.IIdentity, Global.System.Security.Principal.IPrincipal
        
        Private _friendlyName As String
        
        Private _name As String = String.Empty
        
        Private _roles As IEnumerable(Of String)
        
        #Region "Definiciones de método de extensibilidad"

        ''' <summary>
        ''' Este método se invoca desde el constructor una vez completada la inicialización y
        ''' se puede utilizar para configurar más objetos.
        ''' </summary>
        Private Partial Sub OnCreated()
        End Sub
        Private Partial Sub OnFriendlyNameChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnFriendlyNameChanged()
        End Sub
        Private Partial Sub OnNameChanging(ByVal value As String)
        End Sub
        Private Partial Sub OnNameChanged()
        End Sub
        Private Partial Sub OnRolesChanging(ByVal value As IEnumerable(Of String))
        End Sub
        Private Partial Sub OnRolesChanged()
        End Sub

        #End Region
        
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="User"/>.
        ''' </summary>
        Public Sub New()
            MyBase.New
            Me.OnCreated
        End Sub
        
        ''' <summary>
        ''' Obtiene o establece el valor 'FriendlyName'.
        ''' </summary>
        <DataMember()>  _
        Public Property FriendlyName() As String
            Get
                Return Me._friendlyName
            End Get
            Set
                If (String.Equals(Me._friendlyName, value) = false) Then
                    Me.OnFriendlyNameChanging(value)
                    Me.RaiseDataMemberChanging("FriendlyName")
                    Me.ValidateProperty("FriendlyName", value)
                    Me._friendlyName = value
                    Me.RaiseDataMemberChanged("FriendlyName")
                    Me.OnFriendlyNameChanged
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'Name'.
        ''' </summary>
        <DataMember(),  _
         Editable(false, AllowInitialValue:=true),  _
         Key(),  _
         RoundtripOriginal()>  _
        Public Property Name() As String
            Get
                Return Me._name
            End Get
            Set
                If (String.Equals(Me._name, value) = false) Then
                    Me.OnNameChanging(value)
                    Me.ValidateProperty("Name", value)
                    Me._name = value
                    Me.RaisePropertyChanged("Name")
                    Me.OnNameChanged
                    Me.RaisePropertyChanged("IsAuthenticated")
                End If
            End Set
        End Property
        
        ''' <summary>
        ''' Obtiene o establece el valor 'Roles'.
        ''' </summary>
        <DataMember(),  _
         Editable(false)>  _
        Public Property Roles() As IEnumerable(Of String)
            Get
                Return Me._roles
            End Get
            Set
                If (Object.Equals(Me._roles, value) = false) Then
                    Me.OnRolesChanging(value)
                    Me.ValidateProperty("Roles", value)
                    Me._roles = value
                    Me.RaisePropertyChanged("Roles")
                    Me.OnRolesChanged
                End If
            End Set
        End Property
        
        ReadOnly Property Global_System_Security_Principal_IIdentity_AuthenticationType() As String Implements Global.System.Security.Principal.IIdentity.AuthenticationType
            Get
                Return String.Empty
            End Get
        End Property
        
        '''<summary>
        '''Obtiene un valor que indica si la identidad está autenticada.
        '''</summary>
        '''<remarks>
        '''Este valor es <c>true</c> si <see cref="Name"/> no es <c>null</c> o está vacía.
        '''</remarks>
        Public ReadOnly Property IsAuthenticated() As Boolean Implements Global.System.Security.Principal.IIdentity.IsAuthenticated
            Get
                Return (true <> String.IsNullOrEmpty(Me.Name))
            End Get
        End Property
        
        ReadOnly Property Global_System_Security_Principal_IIdentity_Name() As String Implements Global.System.Security.Principal.IIdentity.Name
            Get
                Return Me.Name
            End Get
        End Property
        
        ReadOnly Property Global_System_Security_Principal_IPrincipal_Identity() As Global.System.Security.Principal.IIdentity Implements Global.System.Security.Principal.IPrincipal.Identity
            Get
                Return Me
            End Get
        End Property
        
        ''' <summary>
        ''' Calcula un valor a partir de los campos de clave que identifica de manera única  esta instancia de la entidad.
        ''' </summary>
        ''' <returns>Instancia de objeto que identifica de manera única esta instancia de la entidad.</returns>
        Public Overrides Function GetIdentity() As Object
            Return Me._name
        End Function
        
        '''<summary>
        '''Devuelve si la entidad de seguridad está en el rol.
        '''</summary>
        '''<remarks>
        '''Devuelve si el rol especificado está incluido en los roles.
        '''Esta implementación distingue entre mayúsculas y minúsculas.
        '''</remarks>
        '''<param name="role">Nombre del rol cuya pertenencia se va a comprobar.</param>
        '''<returns>Si la entidad de seguridad está en el rol.</returns>
        Public Function IsInRole(ByVal role As String) As Boolean Implements Global.System.Security.Principal.IPrincipal.IsInRole
            If (Me.Roles Is Nothing) Then
                Return false
            End If
            Return Global.System.Linq.Enumerable.Contains(Me.Roles, role)
        End Function
    End Class
    
    ''' <summary>
    ''' DomainContext correspondiente al DomainService 'UserRegistrationService'.
    ''' </summary>
    Partial Public NotInheritable Class UserRegistrationContext
        Inherits DomainContext
        
        #Region "Definiciones de método de extensibilidad"

        ''' <summary>
        ''' Este método se invoca desde el constructor una vez completada la inicialización y
        ''' se puede utilizar para configurar más objetos.
        ''' </summary>
        Private Partial Sub OnCreated()
        End Sub

        #End Region
        
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="UserRegistrationContext"/>.
        ''' </summary>
        Public Sub New()
            Me.New(New WebDomainClient(Of IUserRegistrationServiceContract)(New Uri("ApNegociosSL-Web-UserRegistrationService.svc", UriKind.Relative)))
        End Sub
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="UserRegistrationContext"/> con el URI del servicio especificado.
        ''' </summary>
        ''' <param name="serviceUri">URI del servicio UserRegistrationService.</param>
        Public Sub New(ByVal serviceUri As Uri)
            Me.New(New WebDomainClient(Of IUserRegistrationServiceContract)(serviceUri))
        End Sub
        
        ''' <summary>
        ''' Inicializa una nueva instancia de la clase <see cref="UserRegistrationContext"/> con el <paramref name="domainClient"/> especificado.
        ''' </summary>
        ''' <param name="domainClient">Instancia de DomainClient que se va a utilizar para este DomainContext.</param>
        Public Sub New(ByVal domainClient As DomainClient)
            MyBase.New(domainClient)
            Me.OnCreated
        End Sub
        
        ''' <summary>
        ''' Invoca de manera asincrónica el método 'CreateUser' del DomainService.
        ''' </summary>
        ''' <param name="user">Valor del parámetro 'user' de esta acción.</param>
        ''' <param name="password">Valor del parámetro 'password' de esta acción.</param>
        ''' <param name="callback">Devolución de llamada que se va a invocar cuando se complete la operación.</param>
        ''' <param name="userState">Valor que se va a pasar a la devolución de llamada. Puede ser <c>null</c>.</param>
        ''' <returns>Instancia de operación que se puede utilizar para administrar la solicitud asincrónica.</returns>
        Public Overloads Function CreateUser(ByVal user As RegistrationData, <RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName:="ValidationErrorBadPasswordStrength", ErrorMessageResourceType:=GetType(ValidationErrorResources)), Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources)), StringLength(50, ErrorMessageResourceName:="ValidationErrorBadPasswordLength", ErrorMessageResourceType:=GetType(ValidationErrorResources), MinimumLength:=7)> ByVal password As String, ByVal callback As Action(Of InvokeOperation(Of CreateUserStatus)), ByVal userState As Object) As InvokeOperation(Of CreateUserStatus)
            Dim parameters As Dictionary(Of String, Object) = New Dictionary(Of String, Object)()
            parameters.Add("user", user)
            parameters.Add("password", password)
            Me.ValidateMethod("CreateUser", parameters)
            Return CType(Me.InvokeOperation("CreateUser", GetType(CreateUserStatus), parameters, true, callback, userState),InvokeOperation(Of CreateUserStatus))
        End Function
        
        ''' <summary>
        ''' Invoca de manera asincrónica el método 'CreateUser' del DomainService.
        ''' </summary>
        ''' <param name="user">Valor del parámetro 'user' de esta acción.</param>
        ''' <param name="password">Valor del parámetro 'password' de esta acción.</param>
        ''' <returns>Instancia de operación que se puede utilizar para administrar la solicitud asincrónica.</returns>
        Public Overloads Function CreateUser(ByVal user As RegistrationData, <RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName:="ValidationErrorBadPasswordStrength", ErrorMessageResourceType:=GetType(ValidationErrorResources)), Required(ErrorMessageResourceName:="ValidationErrorRequiredField", ErrorMessageResourceType:=GetType(ValidationErrorResources)), StringLength(50, ErrorMessageResourceName:="ValidationErrorBadPasswordLength", ErrorMessageResourceType:=GetType(ValidationErrorResources), MinimumLength:=7)> ByVal password As String) As InvokeOperation(Of CreateUserStatus)
            Dim parameters As Dictionary(Of String, Object) = New Dictionary(Of String, Object)()
            parameters.Add("user", user)
            parameters.Add("password", password)
            Me.ValidateMethod("CreateUser", parameters)
            Return CType(Me.InvokeOperation("CreateUser", GetType(CreateUserStatus), parameters, true, Nothing, Nothing),InvokeOperation(Of CreateUserStatus))
        End Function
        
        ''' <summary>
        ''' Crea un nuevo EntityContainer para los EntitySets de este DomainContext.
        ''' </summary>
        ''' <returns>Nueva instancia de contenedor.</returns>
        Protected Overrides Function CreateEntityContainer() As EntityContainer
            Return New UserRegistrationContextEntityContainer()
        End Function
        
        ''' <summary>
        ''' Contrato de la clase Service para el DomainService 'UserRegistrationService'.
        ''' </summary>
        <ServiceContract()>  _
        Public Interface IUserRegistrationServiceContract
            
            ''' <summary>
            ''' Invoca de manera asincrónica la operación 'CreateUser'.
            ''' </summary>
            ''' <param name="user">Valor del parámetro 'user' de esta acción.</param>
            ''' <param name="password">Valor del parámetro 'password' de esta acción.</param>
            ''' <param name="callback">Devolución de llamada que se va a invocar al completar.</param>
            ''' <param name="asyncState">Objecto de estado opcional.</param>
            ''' <returns>IAsyncResult que se puede utilizar para supervisar la solicitud.</returns>
            <FaultContract(GetType(DomainServiceFault), Action:="http://tempuri.org/UserRegistrationService/CreateUserDomainServiceFault", Name:="DomainServiceFault", [Namespace]:="DomainServices"),  _
             OperationContract(AsyncPattern:=true, Action:="http://tempuri.org/UserRegistrationService/CreateUser", ReplyAction:="http://tempuri.org/UserRegistrationService/CreateUserResponse")>  _
            Function BeginCreateUser(ByVal user As RegistrationData, ByVal password As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
            
            ''' <summary>
            ''' Completa la operación asincrónica iniciada por 'BeginCreateUser'.
            ''' </summary>
            ''' <param name="result">IAsyncResult devuelto desde 'BeginCreateUser'.</param>
            ''' <returns>'CreateUserStatus' devuelto desde la operación 'CreateUser'.</returns>
            Function EndCreateUser(ByVal result As IAsyncResult) As CreateUserStatus
        End Interface
        
        Friend NotInheritable Class UserRegistrationContextEntityContainer
            Inherits EntityContainer
            
            Public Sub New()
                MyBase.New
            End Sub
        End Class
    End Class
End Namespace
