使用参数调用WCF服务

时间:2016-12-16 10:27:55

标签: wcf parameters

我正在开发一个SharePoint插件,它具有SharePoint托管部件和提供商托管部件。在我的提供者托管部分中,我有几个服务可以安装一些像Taxonomy和Search这样的东西。我使用C#CSOM。这是提供者托管部分的唯一目的。安装插件时,AppInstalled事件触发器调用远程事件接收器。然后,这个远程事件接收器应该逐个调用我的WCF服务。

现在我的实际问题:我目前使用这种方法来消费我的服务:

[ServiceContract]
public interface ISetupService
{
    string OpenText { get; }
    string DoneText { get; }
    string AppWebUrl { get; set; }

    [OperationContract]
    bool IsInstalled();

    [OperationContract]
    void SetLogComponent(LogList logList);

    [OperationContract]
    void SetAppWebUrl(string url);

    [OperationContract]
    void WriteToLog(string message);

    [OperationContract]
    string GetLogs();

    [OperationContract]
    void Install();        
}

ISetupService:

class PostsController < ApplicationController
  def new
    @post = Post.new
    render :new
  end

  def create
    @post = Post.new(params[:post])
    if @post.save
      redirect_to :show
    else
      render :new # re-render another template
    end
  end
end

我的解决方案并不是必须遵循这种方法,所以我正在寻找更好的东西。具体来说,我需要将ClientContext对象传递给我的ISetupService构造函数。这里最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

选项1 - 懒惰可注射属性 为什么在构造函数中?为什么不使用Lazy Injectable属性?

internal IClientContext Context 
{
    get { return _Context ?? (_Context = SomeStaticHelper.Context); }
    set { _Context = value; } // Allows for replacing IContext for unit tests
} private IClientContext _Context;

public class SomeStaticHelper
{
    public static IContext Context { get; set; } // Set this in global.asax
}
  • 专业版:没有额外的图书馆
  • Pro:您可以轻松替换单元测试中的IContext(使用InternalsVisibleTo)
  • Con:Class与SomeStaticHelper耦合以进行编译。
  • Con:为一个班级做这个很好,但是对100个班级来说这样做并不是那么好。

选项2 - 依赖注入 或者您可以使用直接依赖注入,例如Autofac。 http://docs.autofac.org/en/latest/getting-started/

  • Pro:将类解耦并注入依赖项。
  • Pro:如果你有很多需要依赖注入的类,这就是要走的路,因为开销现在是几个类文件,而不是每个类文件中的属性。
  • Con:您必须在代码中添加一个框架。
  • Con:您现在需要更多代码和其他对象来配置依赖注入。

对于几乎不需要依赖注入的小项目,请使用选项1。我认为这是最简单的方法。

对于一直使用DI的大型项目,请使用选项2。