我正在编写一个项目,它将多个Calendar API(Google Calendar,Outlook等)封装在一个服务中。这将允许我集成可以映射到我们的域模型的不同API。但是,我遇到了所需依赖项溢出到其他项目的问题。这是一个例子:
我创建了一个泛型类,它可以完成从API模型到我们的模型的大部分工作和转换。这是一个例子:
public abstract class CalendarAPIBase<TEventType> : ICalendarAPI
{
public CalendarEvent Get(string id)
{
if (string.IsNullOrEmpty(id))
throw new ArgumentNullException("id");
return Convert(GetEvent(id));
}
public List<CalendarEvent> GetAll()
{
List<CalendarEvent> result = new List<CalendarEvent>();
List<TEventType> es = GetAllEvents();
foreach (TEventType e in es)
result.Add(Convert(e));
return result;
}
protected abstract List<TEventType> GetAllEvents();
protected abstract CalendarEvent Convert(TEventType obj);
//More stuff below.
}
所以这是一件很美好的事情,除了获取来自API的数据之外,任何继承CalendarAPIBase
的东西都不需要做很多工作,基类会处理转化
好的,所以这里出了问题。我创建了一个GoogleCalendarAPI
类,它继承自CalendarAPIBase
。它传入Event
类,该类属于NuGet包Google.Apis.Calendar.v3
。
public class GoogleCalendarAPI : CalendarAPIBase<Event>
这里的问题是这个类暴露了Event
类,因此引用该项目的任何东西都需要引用Google.Apis.Calendar.v3
。理想情况下,任何希望使用此服务的人只需要引用该项目,而不必担心安装其他NuGet包。
如何重组我的课程以防止这种情况发生?
答案 0 :(得分:1)
解决此问题最直接的方法是https://issues.apache.org/jira/browse/SOLR-7606模式。
首先,您制作CalendarAPIBase<TEventType>
及其所有后代internal
。所有公共内容都必须集中在公共ICalendarAPI
界面中。
下一步是介绍这样的公共类:
public static class GoogleCalendarAPIFactory
{
public static ICalendarAPI Instantiate( ....... )
{
.......
return new GoogleCalendarAPI( ..... );
}
}
工厂将使库用户隐藏所有TEventType
麻烦,因此他不需要添加包含TEventType
实现的所有包。
答案 1 :(得分:0)
如果您在代码中直接使用 Google.Apis.Calendar.v3.Event 等类,我不确定您是否可以避免引用第三方程序集。
但是,您可以使用ILMerge将第三方API合并到您自己的API中,这样您的程序集的依赖项就会与程序集一起部署。
我通常在post build事件中使用ILMerge。 例如:
构建GoogleCalendarAPI项目后,合并 GoogleCalendarAPI.dll 和 Google.Apis.Calendar.v3.dll 并将其保存在&#34中; GoogleCalendarAPI_location \ mergerd \ GoogleCalendarAPI.dll&#34; 强>
将&#34; GoogleCalendarAPI_location \ mergerd \ GoogleCalendarAPI.dll&#34; 复制到原始 GoogleCalendarAPI.dll 的位置并替换它。
现在您已经 GoogleCalendarAPI.dll ,其中包含 Google.Apis.Calendar.v3 。 现在,每个引用GoogleCalendarAPI.dll的程序集都会同时获得。