WCF:将参数传递给ServiceHost

时间:2014-10-04 08:29:52

标签: c# web-services wcf

您好我正在使用框架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;
}

}

1 个答案:

答案 0 :(得分:0)

您可以创建一个自己的ServiceHost实现,以便为您的服务注入依赖项,但我建议使用现有的容器。

例如,Ninject具有很好的WCF支持,并且易于使用。内置的NinjectServiceHostFactory可以创建自己的ServiceHost,因此您无需手动创建它。您只需要使用NinjectServiceHostFactory.SetKernel()(以及当然的依赖项)注册内核。

我通常从NijectServiceHostFactory创建一个派生类型,并在其构造函数中使用模块注册内核,但在自托管应用程序中,您可以通过其他方式执行此操作。