您好我正在使用框架4.0,Ioc Microsoft Practice Unity 在主程序中,我在创建服务时加载所有服务,我有两个参数
(IUnitOfWork unitOfWork,IRepository<Persona> personaRepository)
在这种情况下。
在主程序中,如何在创建它时将这两个参数传递给ServiceHost
?
ServiceHost host = new ServiceHost(service)?
服务:
public class RegService : IRegService
{
private IUnitOfWork unitOfWork;
private IRepository<Persona> personaRepository;
public RegService(IUnitOfWork unitOfWork,IRepository<Persona> personaRepository){
this.unitOfWork = unitOfWork;
this.personaRepository = personaRepository;
}
public IEnumerable<Persona> ListaPersonas(){
return personaRepository.GetAll();
}
public int PersonaInsert(Persona oPersona){
personaRepository.Add(oPersona);
return oPersona.IdPersona;
}
}
主:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting services...");
Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ServiceModelSectionGroup serviceModel = ServiceModelSectionGroup.GetSectionGroup(appConfig);
ServiceElementCollection serviceSection = serviceModel.Services.Services;
foreach (ServiceElement objService in serviceModel.Services.Services){
Type service = Type.GetType(objService.Name + ", Mistic.Contador.Services.Implementation");
{
ServiceHost host = new ServiceHost(service);
host.Open();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Service started: " + objService.Endpoints[0].Contract);
}
}
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("Services are ready... Press enter to close the services.");
Console.ReadLine();
}
}
当我在此行中执行host.Open()时,我收到此消息:
提供的服务类型无法作为服务加载,因为它没有默认(无参数)构造函数。要解决此问题,请在类型中添加默认构造函数,或将类型的实例传递给主机。
更新Bootstrap(Unity)
public static class Bootstrapper{
public static IUnityContainer Initialise(){
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
string connectionString = "ModelMovieSolContainer";container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager(), new InjectionConstructor(connectionString));
container.RegisterType(typeof(IGenericRepository<>), typeof(GenericRepository<>));
container.BindInRequestScope<IMovieService, MovieService>();
return container;
}
}
答案 0 :(得分:0)
您可以创建一个自己的ServiceHost实现,以便为您的服务注入依赖项,但我建议使用现有的容器。
例如,Ninject具有很好的WCF支持,并且易于使用。内置的NinjectServiceHostFactory可以创建自己的ServiceHost,因此您无需手动创建它。您只需要使用NinjectServiceHostFactory.SetKernel()(以及当然的依赖项)注册内核。
我通常从NijectServiceHostFactory创建一个派生类型,并在其构造函数中使用模块注册内核,但在自托管应用程序中,您可以通过其他方式执行此操作。