可重用的类库实现

时间:2012-08-30 13:54:25

标签: c# .net

我已经构建了一个可重用的类库来封装我的身份验证逻辑。我希望能够在多个项目中重用已编译的* .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)

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

那就是说,你会很快发现这是一个糟糕的设计。它将跨领域的问题与各种其他类混为一谈,现在这些类无法继承任何其他类。

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

作为类比,考虑需要在桌面上钻一个洞。您将钻(对象)带入您的办公室(班级)。那时,简单地说“On”是没有意义的,因为“On”可以由您的粉丝,灯泡,PC等处理(您班上的其他物品)。您需要指定“钻取”。

答案 2 :(得分:2)

  • 如果您在C#中创建类库,则应学习使用存在的命名约定:Design Guidelines for Developing Class Libraries

  • 以下是命名空间名称的方法:http://msdn.microsoft.com/en-us/library/ms229026(v=vs.100

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

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

这样的调用格式是 class.method ,即使使用“using”指定,你也无法使用“class”名字对象逃脱。有些东西必须“托管”这个功能。

答案 5 :(得分: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();

我将此成本/效益分析留给您..