Я пытаюсь настроить 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();