Непрямая привязка зависимостей к службам WCF без конфигурации XML - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь использовать Ninject Dependency Injection для привязки метода обратного вызова к службам REST WCF, который запускается в своего рода подключаемом модуле программной системы, который НЕ позволяет использовать файл SVC или webconfig или app.config для любогоконфигурация.

Интерфейс и реализация служб WCF определены следующим образом:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    string DoWork();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
    private IEventCallback EventCallback { get; set; }

    public Service1(IEventCallback eventCallback)
    {
        EventCallback = eventCallback;
    }

    public string DoWork()
    {
        if (EventCallback != null)
        {
            EventCallback.Send("Testing Event ID");    
        }            

        return "Success";
    }
}

, где IEventCallback и соответствующая реализация определены следующим образом:

public interface IEventCallback
{
    void Send(string eventId);
}

public class EventCallback : IEventCallback
{
    private Action<string> OnSendCustomEventCallBack { get; set; }

    public EventCallback(Action<string> onSendCustomEventCallBack)
    {
        OnSendCustomEventCallBack = onSendCustomEventCallBack;
    }

    public void Send(string eventId)
    {
        if (OnSendCustomEventCallBack != null)
        {
            OnSendCustomEventCallBack(eventId);
        }
    }
}

Коды для создания службы REST приведены ниже:

public AuthenticatedWebServiceHost(Type type, Uri url, string authenUsername, string authenPassword)
{
    AuthenUsername = authenUsername;
    AuthenPassword = authenPassword;

    IDictionary<string, ContractDescription> desc;

    InitializeDescription(type, new UriSchemeKeyedCollection());
    base.CreateDescription(out desc);
    var val = desc.Values.First();            

    var binding = new WebHttpBinding();
    binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

    Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
    Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = 
        new CustomUserNamePasswordValidator(AuthenUsername, AuthenPassword);

    AddServiceEndpoint(val.ContractType, binding, url);
}

И AuthenticatedWebServiceHost вызывается следующим образом:

var eventCallback = new EventCallback(OnSendCustomEventCallBack);   // where OnSendCustomEventCallBack is a defined method   

// How to write codes to use Ninject to inject the callback into the Service?
// kernel.Bind<IEventCallback>().To<??>()

_webServiceHost = new AuthenticatedWebServiceHost(typeof(Service1), new Uri("http://localhost:9000/Events"),
    "admin", "password");

_webServiceHost.Open();

Поскольку в моем случае не разрешена конфигурация XML,Как написать код для использования Ninject для привязки обратного вызова к службам WCF?

1 Ответ

0 голосов
/ 09 мая 2019

В конце концов я нашел решение, сославшись на Можно ли создать экземпляр WebServiceHost через экземпляр типа службы без конструктора без параметров? без использования NInject.

...