防止其他项目需要依赖项

时间:2016-03-10 08:31:30

标签: c# generics inheritance dependencies

我正在编写一个项目,它将多个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包。

如何重组我的课程以防止这种情况发生?

2 个答案:

答案 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的程序集都会同时获得。