Подтвердить что ты не робот

Может ли библиотека классов иметь файл App.config?

Вот как выглядит мое решение на данный момент:

enter image description here

В проекте Tutomentor.Branding я хотел бы сохранить информацию о брендинге в файле App.config, например имена, цвета и т.д.

В проекте Tutomentor.Data App.config был создан, когда я добавил файл модели .edmx.

Возможно ли это? Любые рекомендации?

При развертывании выведет ли COMBINE эти файлы App.config в один файл?

4b9b3361

Ответ 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 немного не уверен, но я не думаю, что он будет автоматически комбинировать их, я думаю, вы должны сделать это вручную!