Инъекция зависимостей в маршрутный лист Masstransit Activity - PullRequest
0 голосов
/ 07 января 2019

Я работаю над проектом с использованием Masstransit Courier. Я пытаюсь внедрить некоторые служебные зависимости в мои действия, но это не работает. Может кто-нибудь помочь, как использовать DI в деятельности MT. Я не смог найти ни одного рабочего примера с реализацией Activity и DI

В приведенном ниже коде я пытаюсь внедрить IMyservice в свою деятельность. Но мой конструктор активности никогда не выполняется. Я что-то здесь не так делаю?

 public class DownloadImageActivity :
        Activity<DownloadImageArguments, DownloadImageLog>
    {

public DownloadImageActivity (IMyService service)
{
_service=service;
}
 Task<ExecuteResult> Execute(ExecutionContext<DownloadImageArguments> context);
        Task<CompensationResult> Compensate(CompensateContext<DownloadImageLog> context);
    }

код моей сервисной программы ActivityService.cs

_busControl = Bus.Factory.CreateUsingRabbitMq(x =>
        {
            IRabbitMqHost host = x.Host(new Uri(ConfigurationManager.AppSettings["RabbitMQHost"]), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });

            x.ReceiveEndpoint(host, ConfigurationManager.AppSettings["completepitaskqueue"], e =>
            {
                e.PrefetchCount = 100;

                e.ExecuteActivityHost<CompletePiTaskActivity, ComplePiTaskArguments>(Program.Container);
            //  e.ExecuteActivityHost(
            //  DefaultConstructorExecuteActivityFactory<CompletePiTaskActivity, ComplePiTaskArguments>.ExecuteFactory, c => c.UseRetry(r => r.Immediate(5)));
            });

Моя программа.cs

public static IContainer Container;
    static int Main(string[] args)
    {
        ConfigureLogger();
        Container = builder.Build();
        ActivityHelper.Container = Container;

        // MassTransit to use Log4Net
        Log4NetLogger.Use();

        return (int)HostFactory.Run(x => x.Service<ActivityService>());

1 Ответ

0 голосов
/ 07 января 2019

Это зависит от того, какой контейнер вы используете, некоторые из них более поддерживаются, чем другие (в любом случае, из коробки все должно работать).

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

cfg.ReceiveEndpoint(host, "execute-activity", e =>
{
    e.ExecuteActivityHost<TActivity, TArguments>(container);
});

Где контейнер - это контекст компоновщика или контейнер. Это позволит зарегистрировать соответствующих поставщиков услуг и фабрики деятельности для вашей деятельности.

Используется метод расширения: https://github.com/MassTransit/MassTransit/blob/develop/src/Containers/MassTransit.AutofacIntegration/AutofacExtensions.cs#L300

...