2011-06-09 7 views
8

Recientemente encontré ApplicationSettings en .NET WinForms que podría manejar tipos complejos.
Actualmente estoy usando AppSettings en mi ASP.NET WebForms que solo puede manejar cadenas.
¿Puedo usar ApplicationSettings en Webforms? ¿Si es así, cómo?Configuraciones de aplicaciones de tipo personalizado en ASP.NET

+0

Use Web.config en su lugar. – BizApps

+0

Creo que lo que está preguntando es "¿Puede almacenar tipos más complejos de una manera similar a AppSettings dentro de una aplicación web? Si es así, debe echar un vistazo a" Recursos incrustados "en lugar de almacenarlos en la Web. Config –

+0

@Dave: http://stackoverflow.com/questions/6288943/web-config-appsettings-complex-values/6288986#62889986 provocó esta pregunta. Lea los comentarios. Todavía estoy escéptico – naveen

Respuesta

36

La idea básica:

  1. En un proyecto diferente, crear clases que mantendrán sus ajustes personalizados. Por ejemplo:

    public class EndPoint 
    { 
        public string HostName { get; set; } 
        public int Port { get; set; } 
    } 
    
    public class EndPointCollection : Collection<EndPoint> 
    { 
    } 
    
  2. Genere el proyecto que contiene las clases.

  3. Ir a los ajustes pestaña en Propiedades del proyecto. Dirá que aún no hay un archivo de configuración y le preguntará si desea crearlo.

  4. Agregue un nuevo archivo de configuración. En el campo tipo, seleccione Busque y escriba el nombre completo de la clase. Por ejemplo: ClassLibrary.EndPointCollection. Guarde y reconstruya el proyecto.

  5. Pulse el botón de edición para obtener el valor de configuración. (Tenga en cuenta que esto no estará disponible si las clases hechas en el paso anterior están en el mismo proyecto). Use la interfaz de usuario para editar las configuraciones.

    Visual Studio's settings value editor

  6. Si abre el web.config /archivo app.config, verá algo como esto:

    ... 
    <applicationSettings> 
        <WebApplication1.Properties.Settings> 
        <setting name="MyEndPoints" 
          serializeAs="Xml"> 
         <value> 
         <ArrayOfEndPoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
          <EndPoint> 
          <HostName>MyHostName</HostName> 
          <Port>12345</Port> 
          </EndPoint> 
          <EndPoint> 
          <HostName>MyHost1</HostName> 
          <Port>1212</Port> 
          </EndPoint> 
         </ArrayOfEndPoint> 
         </value> 
        </setting> 
        </WebApplication1.Properties.Settings> 
    </applicationSettings> 
    ... 
    
  7. Por último, para leer estas configuraciones de su código, simplemente use

    var endPointCollection = Settings.Default.MyEndPoints; 
    

    The d esigner habrá creado, entre bastidores, los objetos fuertemente tipados para permitir que lo anterior funcione. Puede ver todos los detalles en el archivo Settings.Designer.cs.

Línea inferior: puede realizar todo tipo de configuraciones de tipo personalizado, siempre que esas configuraciones tengan XmlSerializable o tengan convertidor de tipo. Esta técnica funciona en aplicaciones Web, Windows Forms, WPF, aplicaciones de consola etc.

+6

En caso de que alguien más no sea al ver el botón '...' del editor, la razón podría ser que la clase debe estar en un proyecto diferente de donde se encuentra la configuración. Así es como la respuesta está estructurada, pero no dejó claro ese punto. Es un "conocido limitación "de acuerdo con: http://msdn.microsoft.com/en-us/library/wabtadw6(v=vs.100).aspx –

+0

Para aquellos que son escépticos con la respuesta propuesta, recomendaría verificar la siguiente pregunta/respuesta: http://stackoverflow.com/questions/204695/stor ing-values-in-the-web-config-appsettings-or-configsection-which-is-more ... que surge con la idea de crear una sección de configuración personalizada – Learner

+2

@AustinThompson, creo que técnicamente, la clase debe estar en un * espacio de nombres * diferente al proyecto; todavía parece funcionar si está en el mismo proyecto pero con un espacio de nombres diferente. – Sam

2

Aquí hay una variación en la respuesta aceptada, utilizando la siguiente clase definida por el usuario para representar una configuración:

namespace MyApplication 
{ 
    public class EndPoint 
    { 
     public string HostName { get; set; } 
     public int Port { get; set; } 
    } 
} 

La respuesta aceptada propone el uso de una clase de colección especializada, EndPointCollection para mantener la configuración. Sin embargo, no creo que esto sea necesario; un tipo de matriz (EndPoint[]) también parece funcionar.

Sin embargo, escribir el tipo de matriz en el navegador de tipos no funciona; en su lugar, puede especificar el tipo directamente en el .settings archivo (utilizando un editor de texto):

<Setting Name="MyEndPoints" Type="MyApplication.EndPoint[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Además, si el editor valor mostrado en la respuesta aceptada no está disponible, en su lugar puede escribir los valores directamente en el campo de valor utilizando XML:

<ArrayOfEndPoint> 
    <EndPoint> 
     <HostName>MyHostName</HostName> 
     <Port>12345</Port> 
    </EndPoint> 
    <EndPoint> 
     <HostName>MyHost1</HostName> 
     <Port>1212</Port> 
    </EndPoint> 
</ArrayOfEndPoint> 

A setting with its value set to a complex value using the above XML.

Tenga en cuenta que las declaraciones de espacios de nombres XML que Visual Studio genera no son necesarias en el XML, como se muestra arriba.

+1

Tenga en cuenta también que lo anterior no funciona para los miembros del tipo serializado que son de solo lectura (establecimiento de propiedad privada o campo 'readonly'). Lo que desafortunadamente significa que para muchos tipos de tipos definidos por el usuario, alguien querría almacenarlos en la configuración, p. tipos de almacenamiento de valores inmutables simples: esta técnica tan útil no se puede usar. :( –

Cuestiones relacionadas