2014-10-04 3 views
0

Привет Я работаю с Framework 4.0, Ioc Microsoft Practice Unity В основной программе я загружаю все услуги при создании службы у меня есть два параметраWCF: Передача параметра в ServiceHost

(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() У меня есть это сообщение:

тип службы не может быть загружен как служба, поскольку он не имеет значения по умолчанию (параметр er-less). Чтобы устранить проблему, добавьте конструктор по умолчанию к типу или передайте экземпляр типа на хост.

Update Bootstrap (Единство)

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

Вы не можете - класс 'ServiceHost' не имеет конструктора для принятия ваших параметров ... –

+0

@marc_s вы можете предложить мне некоторое решение для решения этой проблемы? Если я не могу использовать ServiceHost – raranibar

+0

Вы упомянули о единстве Microsoft в своем решении, однако я не вижу, где вы его используете. Вы должны использовать специальный InstanceProvider (свой собственный или использовать любой из доступных самородков там), чтобы это работало. – Roman

ответ

0

Вы можете создать собственную реализацию ServiceHost, чтобы обеспечить возможность впрыскивать зависимости в ваш srvices, но я рекомендую использовать существующий контейнер для этого ,

Для примера Ninject имеет отличную поддержку WCF и прост в использовании. Встроенный NinjectServiceHostFactory может создать свой собственный ServiceHost, поэтому вам не нужно создавать его вручную. Все, что вам нужно - это зарегистрировать ядро ​​с помощью NinjectServiceHostFactory.SetKernel() (и зависимости, конечно).

Обычно я создаю производный тип из NijectServiceHostFactory и регистрирую ядро ​​в его конструкторе с помощью модулей, но в самостоятельном приложении вы можете сделать это по-другому.

Смежные вопросы