Сервис Fabric Autofac как? - PullRequest
       21

Сервис Fabric Autofac как?

0 голосов
/ 21 мая 2018

Я пытаюсь настроить IoC (концепция, с которой я еще не очень хорошо знаком) в моем SF в сервисе с состоянием, как описано здесь: https://www.codeproject.com/Articles/1217885/Azure-Service-Fabric-demo и здесь: https://alexmg.com/posts/introducing-the-autofac-integration-for-service-fabric.

в program.cs - main:

var builder = new ContainerBuilder();
builder.RegisterModule(new GlobalAutofacModule());
builder.RegisterServiceFabricSupport();
builder.RegisterStatefulService<Payment>("PaymentType");

using (builder.Build())
{
    ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Payment).Name);
    Thread.Sleep(Timeout.Infinite);
}

GlobalAutofacModule:

public class GlobalAutofacModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ChargeRepository>().As<IChargeRepository>().SingleInstance();
        builder.RegisterType<CustomerRepository>().As<ICustomerRepository>().SingleInstance();
        builder.RegisterType<InvoiceItemRepository>().As<IInvoiceItemRepository>().SingleInstance();
        builder.RegisterType<PlanRepository>().As<IPlanRepository>().SingleInstance();
        builder.RegisterType<ProductRepository>().As<IProductRepository>().SingleInstance();
        builder.RegisterType<SourceRepository>().As<ISourceRepository>().SingleInstance();
        builder.RegisterType<SubscriptionRepository>().As<ISubscriptionRepository>().SingleInstance();
        builder.RegisterType<TokenRepository>().As<ITokenRepository>().SingleInstance();
    }
}

служба вызывается без проблем

        public Payment(StatefulServiceContext context, 
        IChargeRepository chargeRepo, 
        ICustomerRepository customerRepo,
        IInvoiceItemRepository invoiceItemRepo,
        IPlanRepository planRepository,
        IProductRepository productRepo,
        ISourceRepository sourceRepo,
        ISubscriptionRepository subscriptionRepo,
        ITokenRepository tokenRepo)
        : base(context)
    { ... }

в одном из ее методов, необходимых длявызов пользовательского преобразователя (ошибка при отсутствии параметров)

var test = new Mapper().GetProductsDto(false, false);

класс определяется следующим образом:

    private readonly IChargeRepository _chargeRepo;
    private readonly ICustomerRepository _customerRepo;
    private readonly IInvoiceItemRepository _invoiceItemRepo;
    private readonly IPlanRepository _planRepo;
    private readonly IProductRepository _productRepo;
    private readonly ISourceRepository _sourceRepo;
    private readonly ISubscriptionRepository _subscriptionRepo;
    private readonly ITokenRepository _tokenRepo;

    public Mapper(IChargeRepository chargeRepo,
        ICustomerRepository customerRepo,
        IInvoiceItemRepository invoiceItemRepo,
        IPlanRepository planRepository,
        IProductRepository productRepo,
        ISourceRepository sourceRepo,
        ISubscriptionRepository subscriptionRepo,
        ITokenRepository tokenRepo)
    {
        _chargeRepo = chargeRepo;
        _customerRepo = customerRepo;
        _invoiceItemRepo = invoiceItemRepo;
        _planRepo = planRepository;
        _productRepo = productRepo;
        _sourceRepo = sourceRepo;
        _subscriptionRepo = subscriptionRepo;
        _tokenRepo = tokenRepo;
    }
public IEnumerable<ProductListDto> GetStripeProductsDto(bool isLogged, bool isSubscriber) {...}

Итак, как мне создать экземпляр преобразователя и вызвать метод, не передавая каждый репокак параметры?

РЕДАКТИРОВАТЬ: решение tmp до тех пор, пока оно не будет подтверждено / отклонено

    private static void Main()
    {
        try
        {
            using (ContainerOperations.Container)
            {
                ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Payment).Name);
                Thread.Sleep(Timeout.Infinite);
            }
        }
        catch (Exception e)
        {
            ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
            throw;
        }
    }
}

public class ContainerOperations
{
    private static readonly Lazy<IContainer> _containerSingleton =
        new Lazy<IContainer>(CreateContainer);

    public static IContainer Container => _containerSingleton.Value;

    private static IContainer CreateContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule(new GlobalAutofacModule());
        builder.RegisterServiceFabricSupport();
        builder.RegisterStatefulService<Payment>("Inovatic.SF.Windows.PaymentType");
        return builder.Build();
    }
}


public class GlobalAutofacModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        //builder.RegisterType<Mapper>();

        builder.RegisterType<ChargeRepository>().As<IChargeRepository>().SingleInstance();
        builder.RegisterType<CustomerRepository>().As<ICustomerRepository>().SingleInstance();
        builder.RegisterType<InvoiceItemRepository>().As<IInvoiceItemRepository>().SingleInstance();
        builder.RegisterType<PlanRepository>().As<IPlanRepository>().SingleInstance();
        builder.RegisterType<ProductRepository>().As<IProductRepository>().SingleInstance();
        builder.RegisterType<SourceRepository>().As<ISourceRepository>().SingleInstance();
        builder.RegisterType<SubscriptionRepository>().As<ISubscriptionRepository>().SingleInstance();
        builder.RegisterType<TokenRepository>().As<ITokenRepository>().SingleInstance();

    }
}

вызов теперь выглядит так: var productListDto = Mapper.GetStripeProductsDto (isLogged, false);картограф:

    private static IProductRepository _productRepo => ContainerOperations.Container.Resolve<IProductRepository>();

    public static IEnumerable<ProductListDto> GetStripeProductsDto(bool isLogged, bool isSubscriber)
    {
        var productList = _productRepo.GetAllStripeProducts().ToList();

1 Ответ

0 голосов
/ 21 мая 2018

Я думаю, вам также следует зарегистрировать класс Mapper в контейнере IoC и добавить его в конструктор Payment, тогда контейнер создаст Mapper со всеми необходимыми для вас параметрами.Вы можете сделать это, вызвав что-то вроде builder.RegisterType<Mapper>().SingleInstance();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...