Может ли библиотека классов иметь файл App.config?
Вот как выглядит мое решение на данный момент:
![enter image description here]()
В проекте Tutomentor.Branding я хотел бы сохранить информацию о брендинге в файле App.config, например имена, цвета и т.д.
В проекте Tutomentor.Data App.config был создан, когда я добавил файл модели .edmx.
Возможно ли это? Любые рекомендации?
При развертывании выведет ли COMBINE эти файлы App.config в один файл?
Ответы
Ответ 1
Нет, библиотеки классов могут содержать файлы настроек, но их значения будут определены в конфигурации приложения (web.config, app.config...).
Это из-за переопределения параметров конфигурации.
Вам нужно будет объявить разделы конфигурации сборок в app.config или web.config вашего приложения (WPF, SL, ASP.NET...) и определить значение для определенного количества параметров, определенных в правильные настройки сборки.
EDIT:
Добавьте файл настроек в проект и добавьте параметр с областью приложения, и ваша сборка будет иметь примерно следующее:
<?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>
Теперь вам нужно перейти в ваше приложение, и вам нужно скопировать вставку группы разделов и деклараций разделов, а также определение значений параметров. Все это.
Ответ 2
В то время как это более старая нить, она делает еще один внешний вид.
Кажется, вы можете взглянуть на проблему по-другому.
Библиотеки классов по своей природе должны быть переносимыми. Таким образом, любая конфигурация должна быть передана классу, а не находиться в библиотеке. Такие вещи, как строки подключения, по своей природе являются преходящими, поэтому имеет смысл помещать их в собственное приложение.
При использовании методов, содержащихся в библиотеке, вы передаете любую необходимую информацию как часть подписи метода или как общедоступное свойство в классе. Я предлагаю вам создавать общедоступные свойства для ваших элементов конфигурации и передавать их при создании экземпляра класса.
Теперь у вас нет проблем с app.config для DLL, и тогда DLL действительно портативна.
Ответ 3
Просто создайте свой собственный XML файл, назовите его appConfig.xml или что-то подобное, попросите библиотеку вашего класса прочитать файл с помощью System.Xml вместо System.Configuration и упаковать файл вместе с вашей DLL.
Ответ 4
Любая конкретная конфигурация из библиотеки app.config, вы должны вручную вставить файл конфигурации exe.
Ответ 5
просто используйте этот общий конфиг для обработки d.injection сервисов в классе 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();
}
файл 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": "*"
}
//commentout
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
});
}
Ответ 6
Вы можете добавить файл настроек, который будет автоматически генерировать файл app.config.
![Visual C# Items]()
И можете добавить пары ключ-значение в табличной форме с указанным типом данных.
Затем получите доступ к значениям, вызвав Settings.Default. [KEY]
Могу предложить: https://www.technical-recipes.com/2018/creating-a-user-settings-class-library-for-your-c-project/
Ответ 7
Хорошо, что библиотека классов не может иметь свой собственный app.config, но если вы определяете свои настройки из библиотеки классов в app.config для exe файла, библиотека классов должна быть в состоянии найти их.
im немного не уверен, но я не думаю, что он будет автоматически комбинировать их, я думаю, вы должны сделать это вручную!