Jeer
@Jeer
уверенный пользователь

Как классу Program задать модификатор public в c# 9.0?

Всем привет,
В номом шарпе появились инструкции верхнего уровня
Вместо такой записи
using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Теперь пишется так:
using System;

Console.WriteLine("Hello World!");

Мне нужно в новом синтаксисе проставить модификатор доступа public, но я не нахожу этого нигде в документации и в гугле. Помогите, пожалуйста.

Это нужно затем, что я делаю интеграционные тесты и определяю точку запуска через WebApplicationFactory
internal class FunctionalTestsApiApplication : WebApplicationFactory<Program>
{
    protected override IHost CreateHost(IHostBuilder builder)
    {
...


Затем я могу использовать эту фабрику внутри тестовых методов вот так:
[Fact]
    public async Task Login()
    {
        // Arrange
        await using var application = new FunctionalTestsApiApplication();
        var client = application.CreateClient();
...

Но мне необходимо пробросить фабрику через контейнер DI, например, через конструктор, я делаю по инструкции вот так:
public class Auth: IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;
    private readonly IUserArrangeService _userService;
    
    public Auth(WebApplicationFactory<Program> factory, IUserArrangeService userService)
    {
        _factory = factory;
        _userService = userService;
    }

Но в конструкторе слово Program подчеркивается разумеется из-за того, что у этого класса less accesibility, чем у конструктора. А конструктор должен быть public чтобы DI работал
  • Вопрос задан
  • 136 просмотров
Решения вопроса 2
Jeer
@Jeer Автор вопроса
уверенный пользователь
Подсказали, я переписал класс Program в олдовом формате:
namespace Api
{
    public class Program
    {
        static void Main(string[] args)
        {

И это завелось, хотя мне было как-то неочевидно, что так можно сделать.
Всем спасибо!

UPD
Ещё подсказали, что можно в новом синтаксисе можно в самом низу написать через partial и это так же будет работать:
using...
... 
app.Run();

public partial class Program { /* Expose the Program class for use with WebApplicationFactory<T> */ }
Ответ написан
Комментировать
@oleg_ods
Если не менять модификатор доступа можно для тестирования использовать еще и такой подход.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы