0

我构建了一个可重用的类库来封装我的身份验证逻辑。我希望能够在多个项目中重用已编译的 *.dll。

我有什么作品。但是,关于我是如何进行引用的,或者我的类库是如何构建的,这并不完全正确。我需要你的帮助来弄清楚我在做什么 - 错误/不理解......

我有一个类库(Authentication.dll),其结构如下:

namespace AUTHENTICATION
{
    public static class authentication
    {
        public static Boolean Authenticate(long UserID, long AppID) {...}

        //...More Static Methods...//    
    }
}

在我的依赖项目中,我添加了对 Authentication.dll 的引用,并添加了一个 using 指令...

using AUTHENTICATION;

使用这种结构,我可以从我的依赖项目中调用我的 Authenticate 方法,就像这样......

authentication.Authenticate(1,1)

我希望能够不必包含该“身份验证”。在从此类库中调用所有方法之前。那可能吗?如果是这样,我需要对我的类库进行哪些更改,或者我如何在我的依赖项目中实现它?

4

7 回答 7

3

实现这一目标的唯一选择是在 Authentication 程序集中声明一个基类,您在依赖项目中继承该基类。

您可以将 Authenticate 公开为受保护的方法(或公共作品),并在不指定类名的情况下调用它。

public class MyClassInDependentProject : authentication
{
    public void DoSomething(int userId, long appId)
    {
        var success = Authenticate(userId, appId);
        …
    }
}

也就是说,您很快就会发现这是一个糟糕的设计。它将横切关注点与各种其他类混为一谈,这些类现在被禁止从任何其他类继承。

组合是面向对象编程的核心原则,我们有成语“偏好组合胜过继承”。这仅仅意味着我们将复杂性分解为可管理的块(类,它们被实例化为对象),然后将这些对象组合在一起以处理复杂的处理。因此,您已经在类中封装了身份验证的某些方面,并以组合方式将其提供给其他类,以便它们可以将其用于身份验证。从概念上讲,将其视为可以做某事的对象会有所帮助。

打个比方,想想需要在桌子的顶部钻一个洞。您将钻头(对象)带入办公室(班级)。那时,简单地说“开”是没有意义的,因为“开”可以由您的风扇、您的灯、您的 PC 等(您班级中的其他对象)处理。您需要指定“Drill On”。

于 2012-08-30T14:00:22.377 回答
3

在 C# 中,没有类就不能存在函数。所以你总是需要为它定义一些东西,作为静态方法的类或对象方法的对象。

于 2012-08-30T13:57:02.447 回答
2
  • 如果您在 C# 中创建类库,您应该学习使用现有的命名约定:开发类库的设计指南

  • 以下是您应该如何命名命名空间:https ://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/interface

  • C#也是一种面向对象的语言,因此需要类(使用Authentication你应该命名你的类)。

  • 数据源似乎也是硬编码的。您的类库用户(即使只是您)可能想要配置数据源。

  • 谷歌关于单例以及为什么它今天被认为是一种反模式(在大多数情况下)。

于 2012-08-30T14:04:03.663 回答
1

您必须使用 Class 来调用您的方法,只需

什么时候静态类只是 NameClass.Method

当不是静态的,你必须创建实例,ClassName ob = new ClassName(); ob.Method();

于 2012-08-30T13:58:08.687 回答
1

像这样的调用格式是class.method,即使使用“使用”名称,您也无法使用“类”名称来逃避。有些东西必须“主持”这个功能。

于 2012-08-30T13:58:13.670 回答
1

如果不使用 Jay 提到的基类方法,我认为您所要求的是不可能的。但是,如果您只想在调用时简化语法Authenticate(),那么这个愚蠢的解决方案(在需要进行身份验证的每个类中添加一个额外的方法)可能正是您想要的:

private static void DoAuth(long UserID, long AppID){
    authentication.Authenticate(UserID, AppID)
}

如果 ID 在某些情况下始终相同,您也可以重载它:

private static void DoAuth(){
    DoAuth(1,1)
}

是的,这确实意味着您必须在要进行身份验证的任何地方添加更多代码(这就是为什么它很愚蠢!;))。然而,它也确实减少了这种情况:

authentication.Authenticate(1,1);

...进入这个:

DoAuth();

我把这个成本/收益分析留给你。

于 2012-08-30T14:22:23.720 回答
0

我知道我迟到了 3 年,但这里什么都没有。

为了使您的代码更清晰和更具可读性,您应该为您想要拥有的所有可重用代码创建一个新的命名空间。然后在该命名空间中具有身份验证类和身份验证功能。

要使用它,您可以轻松地在命名空间上设置 using 并像您一样使用该功能

Authentication.Authenticate()

但是要使用

Authenticate()

就其本身而言,您始终可以使用 MyNamespace.Authentication; 并在您的代码中直接使用 Authenticate Function 。

于 2016-04-11T08:58:07.133 回答