使用引用项目的引用

3

我正在尝试将我的解决方案分成一个主项目和一个包含一些辅助类的项目。 "辅助项目" 使用了一些外部库,例如 NLog。

我在 csproj 文件中像这样引用 NLog:

<ItemGroup>
    <PackageReference Include="NLog" Version="4.6.6" />
</ItemGroup>

我可以在我的辅助项目中正常使用NLog。但是,这个辅助项目可能会被用于许多不同的主要项目中,因此如果只是从我的主要项目引用辅助项目,也可以让我在主要项目中访问NLog,那就太好了,但是这样做并不起作用。我总是必须在我的主要项目中显式添加对NLog的引用。

有什么方法可以在不手动添加NLog引用的情况下,在我的主要项目中引用NLog吗?


实际上,我建议在您的辅助项目中不要引用NLog,而是只使用日志门面/接口。如果您需要在使用不同日志框架的项目中使用它怎么办?我的意思是:您的主项目应该确定日志框架,而不是辅助项目。 - Fildor
@Fildor提出了一个非常好的观点,但是如果你现在还没有理解引用本身,那么这可能有些困难。 - Jamiec
你正在使用哪种项目类型 - “SDK样式”(.NET Core引入的新样式)还是旧样式?在SDK样式项目中,引用应该具有传递性。 - Jon Skeet
这是一个VFAQ。请在Google上搜索“.net core copy dependencies”。 - Hans Passant
感谢大家的帮助。不幸的是,我必须坚持使用.NET Framework,无法使用.NET Core。 - RockShandy
1个回答

3
有没有什么方法可以在我的主项目中引用NLog,而不必在那里手动添加对NLog的引用?
不行,引用就是这样工作的。你需要在每个直接使用它的项目中添加包引用 *。
但通常处理日志记录的方式是,“helper”库完全不知道用于日志记录的实际库。它只知道一个接口。一个过度简化的例子如下:
public interface ILogger
{
    void Log(string message);
}

然后,主机应用程序需要实现该接口(例如,使用NLog)并通过依赖注入将其传递给辅助类。


* 如果您的程序集不直接使用引用,而只是处于两个使用引用的程序集之间,则不需要引用。在您的特定情况下,这不相关。


你需要将包引用添加到每个使用它的项目中,而不是在 SDK 样式的项目中。引用是可传递的。 - Jon Skeet
@JonSkeet 您的意思是,如果我的汇编代码在承载某个东西和使用某个引用的下游之间,那么我的“在中间”的汇编不需要直接使用该引用?我理解的对吗? - Jamiec
1
是的。例如,Google.Cloud.Firestore.V1 依赖于 Google.Api.Gax.Grpc,后者又依赖于 Google.Api.CommonProtos,再依赖于 Google.Protobuf。如果您的项目依赖于 Google.Cloud.Firestore.V1,则可以使用 Google.Protobuf 中的类型而无需添加其他引用。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接