У меня есть проблема с использованием службы 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 .... или я что-то упустил