我正在开发一个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构造函数。这里最简单的方法是什么?
答案 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
}
选项2 - 依赖注入 或者您可以使用直接依赖注入,例如Autofac。 http://docs.autofac.org/en/latest/getting-started/
对于几乎不需要依赖注入的小项目,请使用选项1。我认为这是最简单的方法。
对于一直使用DI的大型项目,请使用选项2。