2017-07-28 92 views
2

我有我自己的实现GetUserId()函数使得静态能够在静态上下文中检索ID。但我也有很多地方使用内置于asp.net UserManager库中的标准GetUserId()函数。我不使用不同的逻辑同样的事情被重写非静态方法和使用里面的静态的(这是UserManagerService类中)修复:静态和非静态版本的C#中的相同功能#

public override string GetUserId(ClaimsPrincipal user) 
{ 
    return GetUserIdStatic(user); 
} 

public static string GetUserIdStatic(ClaimsPrincipal user) 
{ 
    return user.FindFirst(ClaimTypes.NameIdentifier).Value; 
} 

我没有,因为我更喜欢称之为非静态上下文中的非静态方法(通常超过90%的调用)。所以我更喜欢每当我可以的时候打电话_userManagerService.GetUserId(User)而不是UserManagerService.GetUserIdStatic(User)

从可读性和可维护性的角度来看(以及我目前无法预见的最终有害后果)是否更好地按照上述方式进行;将所有呼叫切换到静态版本;或者我没有想过的其他方式?

回答

2

做一个静态和非静态版本的方法,做同样的事情是非常可疑的。

您应该更换静态方法以获取用户标识以获取用户管理器服务的静态方法或静态属性。这将让你通过调用非静态方法获得静态上下文用户ID:

var userId = StaticGetUserManagerSerice().GetUserIdStatic(user); 

var userId = UserManagerSerice.Instance.GetUserIdStatic(user); 
+0

这是一个很好的答案,但是你不应该对某种类型使用'var' –

+0

谢谢你的建议。它看起来像一个更好的解决方案,虽然我不知道如何自己实例化UserManagerService对象,因为构造函数接受了多个我没有明确控制的参数,而且在其他地方,DI为我处理这件事(我从不实例化反对我自己)。但我认为这可能超出了这个问题的范围。 – m3h0w

+1

@AidanConnelly使用'var'可以帮助您避免重复您已经在别处提供的信息,例如方法的返回类型。为了简洁和一致,我在任何地方都使用'var'。 – dasblinkenlight

1

首先,它不清楚你把哪一个阶级在这个静态和非静态方法。

看来你的方法是什么所谓的“纯函数”,也就是说,它只是返回同样的事情,不管输入并且没有副作用。在这种情况下,该方法不适用于实例,因为它不处理实例的数据。所以从这个角度来看,电话应该是静态的。

但是,根据OOP原则,这种方法的最佳位置似乎是User类,作为非静态方法。

+0

我说哪里的功能被实现小评。 我同意,它并没有明显的意义,它是一个实例方法,但它看起来像一个可读性改进,因为几乎所有由该类的方法执行的操作都是使用正在注入的实例执行的。 – m3h0w