AutoFa c - Создание фабрик с помощью enum с наследованием объектов - PullRequest
0 голосов
/ 29 апреля 2020
class Person : IParticipant {}
class Doctor: Person {}
class RandomParticipantGenerator : IParticipantGenerator{
    enum PersonType
    {
       Person,
       Doctor
    }
    public IParticipant GetParticipant(PersonType type, State state)
    {
    }
    public List<IParticipant> GetParticipants(PersonType type, State state, int numOfPeople)
    {
    }
}

У меня есть эти классы в моей программе, мне нужно иметь возможность производить Person / Doctor с помощью метода GetParticipant. Он должен возвращать Docter, когда перечисление PersonType равно Doctor, новое Person, когда предоставленный тип равен Person. Я использую простой фабричный метод, но я хочу реализовать его, используя Autofa c.

Я хотел бы получить помощь по этому вопросу.

1 Ответ

0 голосов
/ 29 апреля 2020

Если вы хотите использовать Autofa c в ASP. NET Core, сначала вам необходимо настроить метод CreateHostBuilder для использования «Autofa c» в качестве контейнера Io C.

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Затем вы должны добавить метод ConfigureContainer в класс Startup, чтобы обеспечить пользовательскую конфигурацию для конструктора контейнеров следующим образом:

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.Register<IParticipant>((context, parameter) =>
    {
        var type = parameter.TypedAs<PersonType>();
        return type switch
        {
            PersonType.Person => new Person(),
            PersonType.Doctor => new Doctor(),
            _ => new Person(),// Or throw an exception
        };
    }).As<IParticipant>();
}

Наконец, используйте Func<PersonType, IParticipant> вместо IParticipant для _participantFactory декларации и введите его следующим образом:

public class SampleController : Controller
{
    private readonly Func<PersonType, IParticipant> _participantFactory;

    public SampleController (Func<PersonType, IParticipant> participantFactory)
    {
        _participantFactory = participantFactory;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var participant = _participantFactory(PersonType.Person);
        return Ok(participant );
    }
}
...