Voici à quoi ressemble ma solution en ce moment:
Dans le projet Tutomentor.Branding, j'aimerais enregistrer les informations de marque dans le fichier App.config, comme les noms, les couleurs, etc.
Dans le projet Tutomentor.Data, le fichier App.config a été créé lorsque j'ai ajouté un fichier de modèle .edmx d'entité.
Est-ce possible? Des recommandations?
Lors du déploiement, la sortie COMBINERA-t-elle ces fichiers App.config en un seul?
Non, les bibliothèques de classes peuvent contenir des fichiers de paramètres, mais leurs valeurs seront définies dans la configuration de l'application (web.config, app.config ...).
C'est à cause de la fonction de substitution des paramètres de configuration.
Vous devrez déclarer les sections de configuration des assemblys dans app.config ou web.config de votre application (WPF, SL, ASP.NET ...) et définir une valeur pour un nombre particulier de paramètres définis dans l'assembly approprié réglages.
EDIT: ajoutez un fichier de paramètres à votre projet et ajoutez un paramètre avec la portée de l'application, et votre assembly aurait quelque chose comme ceci:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Assembly1.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<Assembly1.Settings1>
<setting name="settingA" serializeAs="String">
<value>a value</value>
</setting>
</Assembly1.Settings1>
</applicationSettings>
</configuration>
Vous devez maintenant accéder à votre application, et vous devez copier-coller le groupe de sections, les déclarations de section et la définition des valeurs des paramètres. C'est tout.
Bien qu'il s'agisse d'un fil plus ancien, il mérite un autre regard.
Il semble que vous souhaitiez peut-être aborder la question différemment.
Les bibliothèques de classes sont par nature censées être portables. Ainsi, toute configuration nécessaire doit être passée à la classe, au lieu de résider avec la bibliothèque. Des choses comme les chaînes de connexion sont par nature transitoires, il est donc logique de les mettre dans l'application propriétaire.
Lorsque vous utilisez les méthodes contenues dans la bibliothèque, vous transmettez toutes les informations nécessaires dans le cadre de la signature de la méthode ou en tant que propriété publique de la classe. Je vous suggère de créer des propriétés publiques pour vos éléments de configuration et de les transmettre lorsque vous instanciez la classe.
Maintenant, vous n'avez aucun problème avec un app.config pour la DLL, et le DLL est alors vraiment portable.
Créez simplement votre propre fichier XML, nommez-le appConfig.xml ou quelque chose de similaire, demandez à votre bibliothèque de classes de lire le fichier à l'aide de System.Xml au lieu de System.Configuration, et empaquetez le fichier avec votre DLL.
Toute configuration spécifique de la bibliothèque app.config, vous devez mettre manuellement votre fichier de configuration exe.
utilisez simplement cette configuration commune pour gérer l'injection de services dans la classe lib;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDBContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
Assembly => Assembly.MigrationsAssembly(typeof(AppDBContext).Assembly.FullName));
});
services.AddScoped<IUsersRepository, UsersRepository>();
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
// configure jwt authentication
var appSettings = appSettingsSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseCors("MyPolicy");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
}
fichier appsettingjson:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
"DefaultConnection": "server=.;database=TestAPP;User ID=yener1;password=yener1;"
},
"AppSettings": {
"Secret": "REPLACE THIS WITH YOUR OWN SECRET, IT CAN BE ANY STRING"
},
"AllowedHosts": "*"
}
//commenter
public static class Hasher
{
public static string ToEncrypt<T>(this T value)
{
using (var sha256 = SHA256.Create())
{
// Send a sample text to hash.
var hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value.ToString()));
// Get the hashed string.
return BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
}
}
}
public class AppDBContext : DbContext
{
public AppDBContext(DbContextOptions options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
public DbSet<Users> Users { get; set; }
//BLL
public class UsersRepository : IUsersRepository
{
private readonly AppDBContext _context;
public UsersRepository(AppDBContext context)
{
_context = context;
}
public async Task<IEnumerable<Users>> GetUsers()
{
return await _context.Users.ToListAsync();
}
[AllowAnonymous]
[HttpPost("authenticate")]
public IActionResult Authenticate([FromBody]UserDto userDto)
{
var user = _userService.Authenticate(userDto.Username, userDto.Password);
if (user == null)
return BadRequest("Username or password is incorrect");
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Id.ToString())
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
// return basic user info (without password) and token to store client side
return Ok(new {
Id = user.Id,
Username = user.Username,
FirstName = user.FirstName,
LastName = user.LastName,
Token = tokenString
});
}
Vous pouvez ajouter un fichier de paramètres qui générera automatiquement le fichier app.config.
Et peut ajouter les paires de valeurs clés sous forme de tableau avec le type de données spécifié. Accédez ensuite aux valeurs en appelant Settings.Default. [KEY]
peut renvoyer: https://www.technical-recipes.com/2018/creating-a-user-settings-class-library-for-your-c-project/