Tengo una solución con muchos proyectos:
Yupii.Games -> Class Library where settings, utilities are shared with projects Yupii.Games.Web -> Web app Yupii.Games.Api -> Web api

Estoy usando mongoDB como base de datos y tengo muchas colecciones, pero quiero respetar la convención del nombre de la colección, por ejemplo:
Monstruos (es una entidad) a monstruos el nombre de la colección.

Tengo un archivo json en Yupii.Games llamado GlobalSettings.json:

"MongoDBCollections": {
"Collections": [
  { "Monster": "monsters" },
  { "User": "users" }
   ...
]}

En Yupii.Games.Api tengo algo como:

public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.Configure<MongoDbSettings>(options =>
        {
            options.ConnectionString = Configuration.GetSection("MongoConnection:ConnectionString").Value;
            options.Database = Configuration.GetSection("MongoConnection:Database").Value;

        )}; 

    }

¿Cómo puedo llegar a GlobalSettings.json -> "MongoDBCollections" -> Colecciones [] para tener también un servicio para:

services.Configure<GlobalSettings>(options =>
        {
            options.Collections = CollectionsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>();
        });     

Luego, haz un bucle para obtener el nombre de la colección asociada:

var collectionName = typeof(T).Name;

foreach (var collection in CollectionList)
{
    if (collectionName == collection.Key)
          return Database.GetCollection<T>(collection.Value);
}
return Database.GetCollection<T>(collectionName);

Quiero poder hacer lo mismo en Yupii.Games.Web
De hecho, puedo hacer que todos funcionen bien de una manera diferente, pero el código y la estructura son horribles. Si alguien puede mostrar una manera mejor y limpia, por favor.
Estoy usando Visual Studio 2017 asp.net core 2.0
Espero que todo esté claro ...
ACTUALIZAR
En Yupii.Games.Web, uno de los métodos realiza llamadas de esta manera:

HttpResponseMessage response = client.GetAsync(RESTVersion + GetCollectionName() + e).Result;      

Y la GetCollectionName ():

    public string GetCollectionName()
    {
        string collectionName = typeof(T).Name;
        ... // get the collection name by associating the typeof(T)
        return name;
    }
0
Sinan 31 ago. 2017 a las 21:51

2 respuestas

La mejor respuesta

En Yupii.Games.Api -> Startup.cs
así es como se ve el constructor de inicio:

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;

        GlobalSettingsConfiguration = new ConfigurationBuilder()
            .AddJsonFile("GlobalSettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"GlobalSettings.{env.EnvironmentName}.json", optional: true)
            .Build();
    }

Ambos archivos json de GlobalSettings están en Yupii.Games (biblioteca de clases).

Agrego una propiedad:

public IConfiguration GlobalSettingsConfiguration { get; }

Luego en ConfigureServices:

        services.Configure<MongoDbSettings>(options =>
        {
            ...
            options.Collections = GlobalSettingsConfiguration.GetSection("MongoDBItems:Collections").Get<Dictionary<string, string>>();      
        });

La clase MongoDBSettings no tiene una propiedad Collections pero hereda de GlobalSettings.cs en el proyecto Yupii.Games

Antes de que pueda recorrer:

"MongoDBItems": {
"Collections": {
  "Monster": "monsters",
  "User": "users",
  "Matrix": "matrices"
}

Haga clic derecho en ambos archivos json de GlobalSettings -> vaya a propiedades -> y copiar al directorio de salida debe ser copiar siempre

Entonces ahora puedo recorrer las colecciones:

        foreach (var collection in CollectionList)
        {
            if (collectionName == collection.Key)
                return Database.GetCollection<T>(collection.Value);
        }

¡Así que esto es todo! Gracias por ayudar a los chicos (@Jaya y @ BOR4) :)

0
Sinan 1 sep. 2017 a las 23:32

Le sugiero que evite leer nada de config. Simplemente tenga un método genérico donde más le convenga que haga esto:

MongoCollection = mongoDatabase.GetCollection<T>(typeof(T).Name.ToLower() + "s");

De esta manera, nunca tendrá que actualizar la configuración, tiene una convención de nomenclatura, si desea cambiar la convención de nomenclatura, debe cambiarla en un solo lugar ...

PD: Traté de comprender su problema específico, pero después de leer varias veces su pregunta, todavía no estaba seguro de qué era exactamente lo que necesitaba.

0
BOR4 1 sep. 2017 a las 08:24