我已经构建了一个可重用的类库来封装我的身份验证逻辑。我希望能够在多个项目中重用已编译的* .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)
我希望能够不必包含“身份验证”。在所有从此类库中调用方法之前。那可能吗?如果是这样,我需要对我的类库进行哪些更改,或者我如何在我的依赖项目中实现它?
答案 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();
我将此成本/效益分析留给您..