如何仅为一个客户机定义方法,并限制对其他客户机的访问

本文关键字:客户机 访问 其他 方法 定义 何仅 一个 | 更新日期: 2023-09-27 18:06:48

我在一次采访中被问到这个问题。假设我有一个包含多个方法的dll(或类),由10个客户机使用。现在,其中一个客户机需要更改一个方法并向类添加一个新方法。如何在没有其他客户端访问新方法的情况下实现这一点?

如何仅为一个客户机定义方法,并限制对其他客户机的访问

看来您应该创建一个从原始类派生的新类,并具有额外的功能。例如:

public class OriginalClass 
{
    public int SomeOriginalMethod() { }
}
public class YourNewClass : OriginalClass
{
    public int SomeNewMethod() { }
}

这样做有两个好处。您的客户机将获得新的功能,而其他客户机仍将使用您的原始类。如果您想限制对新功能的访问,您可以在原始类中添加新方法作为internal,并使用InternalsVisibleTo属性仅为您想要的客户端提供访问

您可以使用条件编译使代码保持不变您只需使用编译标志来更改它,例如

#if CLIENTA
/* client a code here */
#else
/* the other version of the code for not client a */
#endif

如果我正确理解了这个问题,您的类需要为一个客户端公开一个新方法并更改现有方法的行为,而不是为其他客户端。

实现这一目标的一个简单方法是发布包含类的程序集的不同版本。正如其他人建议的那样,您可以使用条件编译,或者简单地在具有不同版本号的程序集中实现所需的更改。在这种情况下,其他要求较低的客户端将使用不包含这些更改的程序集的旧版本。

当然,你可能会被要求将你的程序集/类的相同版本发布给你所有的客户端。在这种情况下,解决问题的一种方法是让类显式地实现一个新的接口,该接口仅供您的要求苛刻的客户端使用。你的代码看起来像这样:

// encapsulates changes requested by the client
public interface INew
{
    void DoNewStuff();
    int Foo();
}
public class ExistingClass : INew
{
    public int Foo() { /*the old implementation of Foo()*/ }
    // Changes go here:
    void INew.DoNewStuff() { /*implementation of the new method*/ }
    int INew.Foo() {/*the new implementation of Foo()*/}
}

在这里,方法DoNewStuff()和现有方法Foo()的新实现对调用者是不可见的,除非它们首先将您的类强制转换为INew接口,像这样:

ExistingClass ex = new ExistingClass();
INew n = ex as INew;
n.DoNewStuff();
n.Foo(); // calls the new implementation of Foo()

这种方法有两个潜在的明显缺点,但是:1)您必须强制客户端采用使用您的类的新方法,如上所示;2)它并不完全阻止您的其他客户端使用新方法(但至少它不会干扰他们以旧方式使用您的类)。从这个问题来看,这两个问题是否真的很重要有点不清楚,所以这种方法很可能就是面试官想要的。