【发布时间】:2015-10-19 12:21:54
【问题描述】:
我正在开展一个项目,我们正在使用存储库模式抽象对 SharePoint 存储数据的访问,如下所示(为简洁起见,省略了详细信息):
public interface IDocumentRepository { ... }
public class SharePointDocumentRepository: IDocumentRepository
{
public SharePointDocumentRepository(Microsoft.SharePoint.Client.ClientContext clientContext)
{
...
}
}
因此,为了能够在 ASP.Net MVC 应用程序中使用 IDocumentRepository 实例,在 UnityConfig.cs 中容器配置如下:
...
container.RegisterType<IDocumentRepository, SharePointDocumentRepository>();
...
问题是,在运行时,我得到以下异常:
ClientContext 类型有多个长度为 1 的构造函数。无法 消除歧义。
为了解决这个问题,我需要注册应该如何解析 ClientContext。到目前为止,我尝试了以下方法,但没有成功:
- 配置构造函数的使用,有一个字符串参数
- 配置 Unity 以在需要 ClientContext 时返回特定实例
所以,我的问题是:有没有办法配置 Unity 来解析 ClientContext,或者我是否应该通过 IDocumentRepository 接口的属性来注入它,只要我得到这个接口的一个实例?注意:第二种方法将使 SharePoint 存储库难以在任何其他组件中使用,这些组件无法访问 HTTP 上下文,因此它不是一个可取的方法。
备注:在不使用 DI 的情况下创建存储库的实例可以如下完成:
...
[SharePointContextFilter]
public ActionResult Index()
{
SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
using(var clientContext = spContext.CreateUserClientContextForSPHost())
{
var documentRepository = new SharePointDocumentRepository(clientContext);
...
}
...
return View();
}
请注意,SharePointContextFilterAttribute、SharePointContextProvider 和 SharePointContext 是从“SharePoint 应用程序”项目模板创建项目时自动生成的。
【问题讨论】:
-
如果你手动创建
SharePointDocumentRepository和ClientContext,你会怎么做?您可以将该代码添加到您的问题中吗?
标签: c# asp.net-mvc sharepoint dependency-injection unity-container