Явный вызов конструктора службы при размещении веб-службы WCF в IIS - PullRequest
4 голосов
/ 08 июня 2011

Я хочу разместить свой сервис WCF на Microsoft IIS (хостинг IIS).

Для этого я создал свой сервис:

// The service
public class MyService : IMyService {
    // Ctors
    public MyService() {
        // Def ctor: I don't want to call it
    }
    public MyService(...) : this() {
        // Parametric ctor, I want to call it!
    }
   ...
}

// The contract
[ServiceContract]
public interface IMyService {
    ...
}

Я создал файл SVC (хороший подход к предоставлению базового адреса для моей службы):

<@ServiceHost Service="MyService" @>

Но при размещении моей службы (просто создавая виртуальный каталог в IIS, указывающий на папку, где находится мое приложение, каталог проекта)обычно), IIS вызывает конструктор по умолчанию.

Как заставить IIS вызывать другой конструктор?

PS: я знаю, что можно указать HostServiceFactory.Это то, что я должен использовать здесь?Это возвращает мне фабрику и хозяина.Для хоста я не могу воздействовать на параметры, переданные хостуОднако как мне решить эту проблему?

ПРИМЕЧАНИЕ. Я понял, что многие решения основаны на инверсии управления (IoC) и нескольких IoC-средах, таких как Unity , Проект замка и Spring.NET .Однако я бы не стал их использовать вообще.Может ли WCF сделать это самостоятельно?Я не могу согласиться с тем, что WCF не может позволить программисту разместить службу, создав ее соответствующим образом ...

Ответы [ 3 ]

6 голосов
/ 08 июня 2011

Вы должны написать несколько пользовательских классов для поддержки создания службы с параметрами:

  • Пользовательский класс, реализующий IInstanceProvider.Этот класс будет отвечать за создание экземпляра службы с вашим конструктором не по умолчанию.
  • Пользовательский класс, реализующий IServiceBehavior.Этот класс будет отвечать за добавление провайдера настраиваемого экземпляра в диспетчер конечных точек.
  • Настраиваемый ServiceHost, который будет применять ваше поведение.
  • Настраиваемый ServiceHostFactory, который будет создавать экземпляр узла настраиваемой службы.Вы будете ссылаться на эту фабрику из файла .svc.

Как правило, это то же самое, что создание поддержки для внедрения зависимостей.Вы можете проверить, например, эту статью .

0 голосов
/ 21 ноября 2016

Если все, что вам нужно, это вызвать определенный конструктор в вашем сервисе, то вам нужно только реализовать IInstanceProvider и прикрепить IServiceBehavior к вашему сервису:

IInstanceProvider

public class ServiceInstanceProvider : IInstanceProvider
{
    public object GetInstance(InstanceContext instanceContext)
    {
        return this.GetInstance(instanceContext, null);
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return new MyService(...);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {}
}

IServiceBehavior as Attribute

public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
    public void AddBindingParameters(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase,
            Collection<ServiceEndpoint> endpoints,
            BindingParameterCollection bindingParameters)
    {}

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                if (!ed.IsSystemEndpoint)
                {
                    ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider();
                }
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase)
    {}
}

MyService с пользовательским атрибутом ServiceBehavior

[InstanceProviderBehavior]
public class MyService : IMyService {
    public MyService() { }
    public MyService(...) : this() {
        ...
    }
   ...
}

Подробнее об этом здесь:

0 голосов
/ 08 июня 2011

Взгляните на Castle WCF Facility (я использую его в производстве) или Autofac WCF интеграция

...