2012-03-18 11 views
5

Tengo una aplicación web que tiene funcionalidad de búsqueda. El algoritmo de búsqueda se compila en un dll separado. En el código C# para el algoritmo de búsqueda, estoy usando cadenas contenidas en un archivo de configuración para apuntar al directorio donde reside el índice de búsqueda. Una vez que se compila el código de búsqueda, la información de configuración se incorpora en Search.dll.config que se coloca en el directorio bin junto con Search.dll. Ahora en mi aplicación web, agrego Search.dll a las referencias. El archivo de configuración no se agrega a la aplicación web. Sin embargo, la aplicación web funciona bien y sabe dónde está el archivo. Porque dentro de Settings.Designer usa el DefaultSettingValueAttribute para asignar un valor predeterminado si el archivo de configuración no está allí.moviendo los archivos de configuración para un dll a la aplicación que llama al dll

¿Cómo agrego también Search.dll.config a mi aplicación web para que el operador pueda cambiar la ubicación de los archivos de índice en el servidor según sea necesario?

Gracias

EDIT:

He intentado añadir el archivo de configuración a mi carpeta de implementación. Pero ASP.NET pone los dlls en un directorio en C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Archivos temporales ASP.NET \ root ... y el archivo de configuración no se copia allí. Entonces, en este momento no tengo idea de cómo incluir el archivo de configuración con mi código.

Gracias por su ayuda.

Nota:

He estado usando el siguiente código para obtener los valores del archivo de configuración en la aplicación. Sin embargo, depende de que el dll y el archivo de configuración estén en la misma carpeta, lo cual no sé cómo lograr.

var executingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
    var location = executingAssembly.Location; //C:\MyApp\bin\Debug\Search.dll 
    var config = ConfigurationManager.OpenExeConfiguration(location); 
    var sections = config.Sections; //count of this is 21 
    ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings"); 
    ConfigurationSectionCollection csc = csg.Sections; 
    ConfigurationSection cs = csc.Get("Search.Properties.Settings"); 

Respuesta

5

Su mejor opción es agregar la configuración al proyecto web directamente. .NET realmente no admite la configuración asociada a una biblioteca en la forma en que lo intenta; y esto es por diseño. Es posible que otros usuarios de su biblioteca necesiten una configuración diferente. Marque el archivo como contenido que debe copiarse en la carpeta de salida.

EDIT:

Para hacer este conjunto de "Acción de generación" a "contenido" y "Copiar a directorio de salida", como "Copiar si es posterior" en las propiedades del archivo. Puede descubrir el archivo en la carpeta bin usando HttpRuntime.BinDirectory. Es posible que desee pasar esta ubicación a su biblioteca en lugar de hacer que la biblioteca asuma que se está ejecutando en un proyecto web.

O bien, inserte la configuración que necesita en web.config (los archivos de configuración también tienen la capacidad de dividir la configuración en un archivo separado).

Finalmente, podría considerar incorporar el archivo como un recurso.

EDIT:

Mirando el código que está utilizando, sólo se mueven en web.config. Mucho más fácil e idiomático. Una vez que está en web.config simplemente use ConfigurationManager.GetSection() para leer su sección.

Incidentalmente, hay un diseñador de sección de configuración gratuito que hace que la creación de clases para admitir secciones de configuración personalizadas sea muy sencilla.Mira en la galería de extensiones de VS en línea aquí:

http://visualstudiogallery.msdn.microsoft.com/2a69f74e-83df-4eb0-8cac-cd83b451cd1d?SRC=VSIDE

+0

Gracias! ¿Cómo puedo "Marcar el archivo como contenido que debe copiarse a la carpeta de salida"? – Barka

+0

Gracias! Puedo mover las líneas de configuración a web.config, pero ¿cómo podrá mi dll leer web.config? Parece que asp.net los coloca en diferentes carpetas con nombres aleatorios. – Barka

+0

Edité mi respuesta para tratar con esto. –

5

La forma ideal es eliminar la dependencia de configuración de DLL. Un dll está diseñado para ser utilizado por una aplicación y la configuración pertenece a la aplicación, no a un dll.

En la mayoría de los escenarios, puede deshacerse de dependiendo de/reading from config en el código dll usando la inyección de dependencia a través del contenedor DI o mediante compose manual.

si su búsqueda dependerá de la configuración, haga los ajustes como una dependencia para su clase de punto de entrada dll y proceda con el código dll suponiendo que su clase de punto de entrada obtiene su configuración.

Luego, puede proporcionar el valor de configuración de su aplicación, ya sea web/windows/console y leyendo el archivo de configuración/db/web service/file system.

código de ejemplo:

en la DLL:

public interface ISearcherDirectorySettings 
{ 
    string[] SearchIndexPointers { get; } 
} 

public class Searcher 
{ 
    private readonly ISearcherDirectorySettings _searchDirctorySettings; 

    public Searcher(ISearcherDirectorySettings searchDirtorySettings) 
    { 
     _searchDirctorySettings = searchDirtorySettings; 
    } 

    public void SearchAlgorithm() 
    { 
     var indexes = _searchDirctorySettings.SearchIndexPointers; 
     // search code 
    } 
} 

En su aplicación:

public class SearcherDirectorySettings : ISearcherDirectorySettings 
{ 
    private readonly string[] _pointers; 
    public SearcherDirectorySettings(string[] pointers) 
    { 
     _pointers = pointers; 
    } 

    public string[] SearchIndexPointers 
    { 
     get { return _pointers; } 
    } 
} 

public class ApplicationRootClass //Owns configuration file 
{ 
    const string FirstPointerKey = "File1"; 
    const string SecondPointerKey = "File2"; 

    private Func<string, string> _getFromConfig = key => ConfigurationManager.AppSettings[key]; 

    public ApplicationRootClass() 
    { 
     var searcherDirectorySettings = new SearcherDirectorySettings(new[] { _getFromConfig(FirstPointerKey),_getFromConfig(SecondPointerKey) }); 

     var searcher = new Searcher(searcherDirectorySettings); 
     searcher.SearchAlgorithm(); 
    } 
} 

Con esto, se puede lograr "a prueba rápida". puede hacer que la búsqueda dlls se use en cualquier aplicación y será responsabilidad de la aplicación proporcionar el valor de la configuración.

Si termina utilizando el dll en múltiples aplicaciones/proyectos y duplica el código de clase de configuración, tenga un componente de utilidad que haga el trabajo o mueva la clase de configuración al dll pero deje la instanciación de la clase de configuración a la aplicación.

1

Así es como se hace lo que quiere hacer, a diferencia de lo que algunos piensan que debe hacer:

(lo siento, estoy trabajando en VB por el momento)

Diga el DLL se llama mycompany.mynamespace.dll

  1. Cambie el nombre del archivo app.config en su proyecto DLL para mycompany.mynamespace.dll.config
  2. En sus propiedades, dicen Copiar si es más nuevo
  3. Usar este código (dentro de la DLL) para acceder a su entorno:

    Dim appConfig = ConfigurationManager.OpenExeConfiguration(Me.GetType.Assembly.Location) 
        _WorkingDirectory = appConfig.AppSettings.Settings("WorkingDirectory").Value 
    
Cuestiones relacionadas