gpt4 book ai didi

c# - 处理可选依赖项 (C#)

转载 作者:可可西里 更新时间:2023-11-01 08:47:02 24 4
gpt4 key购买 nike

我们有一个可以选择与 TFS 集成的应用程序,但是由于集成是可选的,我显然不希望所有机器都需要 TFS 程序集作为要求

我该怎么办?

  1. 我可以在我的主要程序集中引用 TFS 库吗,只要确保我在使用 TFS 集成时只引用 TFS 相关对象。
  2. 或者,更安全的选择是在一些单独的“TFSWrapper”程序集中引用 TFS 库:

    一个。那么我可以直接引用该程序集吗(只要我小心我所说的)

    我是否应该公开一组接口(interface)供我的 TFSWrapper 程序集实现,然后在需要时使用反射实例化这些对象。

1 对我来说似乎有风险,另一方面 2b 似乎过于夸张了——我基本上是在构建一个插件系统。

肯定有更简单的方法。

最佳答案

最安全的方法(即在您的应用程序中不犯错误的最简单方法)可能如下所示。

创建一个接口(interface)来抽象您对 TFS 的使用,例如:

interface ITfs
{
bool checkout(string filename);
}

使用 TFS 编写一个实现此接口(interface)的类:

class Tfs : ITfs
{
public bool checkout(string filename)
{
... code here which uses the TFS assembly ...
}
}

在不使用 TFS 的情况下编写另一个实现此接口(interface)的类:

class NoTfs : ITfs
{
public bool checkout(string filename)
{
//TFS not installed so checking out is impossible
return false;
}
}

在某处有一个单例:

static class TfsFactory
{
public static ITfs instance;

static TfsFactory()
{
... code here to set the instance
either to an instance of the Tfs class
or to an instance of the NoTfs class ...
}
}

现在只有一个地方需要注意(即 TfsFactory 构造函数);您的其余代码可以在不知道是否安装了 TFS 的情况下调用 TfsFactory.instance 的 ITfs 方法。


回答下面最近的评论:

根据我的测试(我不知道这是否是“定义的行为”)当您(一旦)调用一个依赖于缺少的程序集的方法时会抛出异常。因此,将依赖于缺失程序集的代码封装到程序集中至少一个单独的方法(或单独的类)中非常重要。

例如,如果缺少 Talk 程序集,将不会加载以下内容:

using System;
using OptionalLibrary;

namespace TestReferences
{
class MainClass
{
public static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "1") {
Talk talk = new Talk();
Console.WriteLine(talk.sayHello() + " " + talk.sayWorld() + "!");
} else {
Console.WriteLine("2 Hello World!");
}
}
}
}

将加载以下内容:

using System;
using OptionalLibrary;

namespace TestReferences
{
class MainClass
{
public static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "1") {
foo();
} else {
Console.WriteLine("2 Hello World!");
}
}

static void foo()
{
Talk talk = new Talk();
Console.WriteLine(talk.sayHello() + " " + talk.sayWorld() + "!");
}
}
}

这些是测试结果(在 Windows 上使用 MSVC# 2010 和 .NET):

C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>TestReferences.exe
2 Hello World!

C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>TestReferences.exe 1

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OptionalLibrary, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
at TestReferences.MainClass.foo()
at TestReferences.MainClass.Main(String[] args) in C:\github\TestReferences\TestReferences\TestReferences\Program.cs:
line 11

C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>

关于c# - 处理可选依赖项 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com