Добавьте атрибут поведения в WorkflowServiceHost.

Привет всем, у меня возникла проблема при добавлении пользовательского поведения в WorkflowServiceHost.

Вот мой WorflowServiceHostFactory:

public class ScoringWorkflowServiceHostFactory : WorkflowServiceHostFactory, IServiceHost<IKernel>
{
    private static IKernel _InjectionInstance;
    public IKernel InjectionInstance
    {
        get { return _InjectionInstance ?? (_InjectionInstance = new StandardKernel(new ScoringWorkflowServicesNinjectModule(Scope))); }
    }

    public object Scope
    {
       get { return Guid.NewGuid(); }      
    }

    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
    {

        String fullFilePath = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, constructorString);

        WorkflowService wf = CSharpExpressionCompiler.Compile(fullFilePath);

        System.ServiceModel.Activities.WorkflowServiceHost host = base.CreateWorkflowServiceHost(wf, baseAddresses);


        NinjectBehaviorAttributeWF behavior = new NinjectBehaviorAttributeWF(wf);

        host.Description.Behaviors.Add(behavior);

        host.AddNinjectResolverExtension(InjectionInstance, Scope);

        TypeAdapterFactory.SetCurrent(new SvcMapperAdapterFactory());

        LoggerFactory.SetCurrent(new EntLibLoggerFactory());

        return host;
    }

}

Вот мое поведение:

public class NinjectBehaviorAttributeWF : Attribute, IServiceBehavior
{
private System.ServiceModel.Activities.WorkflowService host;

public NinjectBehaviorAttributeWF(System.ServiceModel.Activities.WorkflowService host)
{

    this.host = host;
}
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {

        foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher endpointDispatcher in dispatcher.Endpoints)
            {
                DispatchRuntime dispatchRuntime = endpointDispatcher.DispatchRuntime;

                dispatchRuntime.InstanceContextProvider = new PerCallInstanceContextProvider(dispatchRuntime);
            }
        }
    }

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

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

Я не знаю ни того, как это возможно, ни того, как создать конструктор по умолчанию для службы рабочего процесса (поскольку реальной реализацией является xamlx, а не простой класс)

Итак, я пробовал с настраиваемым провайдером:

 dispatchRuntime.InstanceProvider = new CustomInstanceProvider(host.Body);

где CustomInstanceProvider:

public class CustomInstanceProvider : IInstanceProvider
{
string message;
private System.Activities.Activity activity;

public CustomInstanceProvider(string msg)
{
Console.WriteLine("The non-default constructor has been called.");
this.message = msg;

}

public CustomInstanceProvider(System.Activities.Activity activity)
{
  this.activity = activity;
}

public object GetInstance(InstanceContext instanceContext,   System.ServiceModel.Channels.Message message)
{
Console.WriteLine("GetInstance is called:");
return this.activity;
}

public object GetInstance(InstanceContext instanceContext)
{
  Console.WriteLine("GetInstance is called:");
  return this.activity;
}

public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
Console.WriteLine("ReleaseInstance is called");
}
}

Но у меня есть эта ошибка:

System.InvalidCastException: Unable to cast object of type 'System.ServiceModel.Activities.WorkflowService' to type 'IHttpGetMetadata'.

Как я могу решить мою проблему? Большое спасибо


person user2328912    schedule 15.01.2014    source источник