Зарегистрируйте и разрешите множественный множественный сервис WCF + AutoFac - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть проблема с использованием службы wcf в mvc контроллере.

У меня несколько служб wcf: служба вычислений и служба выписок. Оба размещены в консольном приложении и имеют доступ к ним с помощью URL. http://localhost: 8080 / test / CalculationService http://localhost: 8080 / test / StatementService

Используйте autofa c, чтобы разрешить зависимость уровня службы, использовать уровень biz для дальнейшей обработки.

Консольное хост-приложение:

public static void Main(string[] args)
        {
 ContainerBuilder builder = new ContainerBuilder();
            //Biz layer 
            builder.Register(c => new CalculationEngine()).As<ICalculationEngine>();
            builder.Register(c => new StatmentEngine()).As<IStatementEngine>();

            //Services
            builder.Register(c => new CalculationService(c.Resolve<ICalculationEngine>())).As<ICalculationService>();
            builder.Register(c => new StatementService(c.Resolve<IStatementEngine>())).As<IStatementService>();

            Uri address = new Uri("http://localhost:8080/test");

            var mappings = new Dictionary<Type, Type>
            {
                {typeof (ICalculationService), typeof (CalculationService)},
                {typeof (IStatementService), typeof (StatementService)}
            };

            var serviceHosts = new List<ServiceHost>(mappings.Count());

            using (IContainer container = builder.Build())
            {
                ServiceHost host = null;

                foreach (var type in mappings)
                {
                    Type contractType = type.Key; //IStatement
                    Type implementationType = type.Value; //Statement                    

                    var serviceUri = new Uri(address + "/" + implementationType.Name);
                    var serviceHost = new ServiceHost(implementationType, serviceUri);
                    var debugBehavior = serviceHost.Description.Behaviors.Single(x => x is ServiceDebugBehavior) as ServiceDebugBehavior;

                    debugBehavior.IncludeExceptionDetailInFaults = true;
                    serviceHost.AddServiceEndpoint(contractType, new BasicHttpBinding(), string.Empty);
                    serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true, HttpGetUrl = serviceUri });
                    serviceHost.AddDependencyInjectionBehavior(contractType, container);                    
                    serviceHost.Open();                    
                    serviceHosts.Add(serviceHost);
                    Console.WriteLine("Hosted service of type {0} at endpoint {1}", contractType, serviceUri);
                }
                Console.WriteLine("Host has started");
                Console.ReadLine();
                host.Close();
                Environment.Exit(0);
            }
        }   

В MVC контроллере. Я хочу использовать несколько служб, использующих в настоящее время службу вычислений:

 public class HomeController : Controller
    {
        ICalculationService _calculationService;
 IStatementService _statementService;
        public HomeController(ICalculationService calculationService,, IStatementService statementService)
        {
            _calculationService = calculationService;
_statementService = statementService;
        }
        public ActionResult Index()
        {
            var aa = _calculationService.GetData(10); //Call service method
            return View();
        }
   }

Я использую приведенный ниже код запуска приложения

public class AutofacContainerBuild
    {
        public static void Start( )
        {

            var builder = new ContainerBuilder();             

            //Work for single service calcuationservice
            //But not sure how to singleinstance for multiple service ?

            builder
              .Register(c => new ChannelFactory<ICalculationService>(
                new BasicHttpBinding(),
                new EndpointAddress("http://localhost:8080/test/CalculationService")))  
              .SingleInstance();

            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            builder
              .Register(c => c.Resolve<ChannelFactory<ICalculationService>>().CreateChannel())
              .As<ICalculationService>();

             //Not sure about how to create channel when we have multiple service  
            builder
               .Register(c => c.Resolve<ChannelFactory<IStatementService>>().CreateChannel())
               .As<IStatementService>();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver

        }
    }

У меня возникли проблемы с тем, как зарегистрировать / использовать множественный wcf сервис с использованием autofa c в mvc контроллере ... как создать канал и создать синглетный экземпляр channelfactory .... или я что-то упустил

...