一个用泛型隐式传递权限关键字的方法
最近和IBM在重新做公司的平台,其中涉及多租户问题,之前处理多租户数据隔离时考虑很简单,直接把权限关键字作为每个方法的参数传递给DAO。带来的问题是在编码过程中有部分同事经常会忘记添加,维护也有些麻烦,这次就想着将这个问题给处理掉。IBM给了一个方案,可以将权限关键字写入当前执行线程中,在DAO中再从线程中取出来,但这样限定了UI层跟DAO都只能使用同一个线程,虽然暂时不会有UI层跟DAO线程不一样的情况,但总感觉有些不舒服。之前也一直在考虑是否可以通过一个公共方法来调用DAO,在公共方法中设置权限关键字,但都没有仔细的去想,今天在整理文档时突然想到用泛型不就能完美的解决这个问题么,于是就小实现了一下,是完全可以的。以下列出关键代码。
DAO部分
public interface IData
{
UserInfo MyUserInfo { get; set; }
}
public class TestData : IData
{
public UserInfo MyUserInfo { get; set; }
public string TestMethod(string str)
{
return string.Format("Class:[TestData] Method:[TestMethod] User:[{0}] Result[{1}]", MyUserInfo.UserName, str);
}
}
{
UserInfo MyUserInfo { get; set; }
}
public class TestData : IData
{
public UserInfo MyUserInfo { get; set; }
public string TestMethod(string str)
{
return string.Format("Class:[TestData] Method:[TestMethod] User:[{0}] Result[{1}]", MyUserInfo.UserName, str);
}
}
在UI层建立一个代理,用于隐藏传递用户权限关键信息
public class Proxy
{
public static T GetIData<T>() where T : DAL.IData, new()
{
var d = new T();
//从Session获取UserInfo 并赋值给新创建的d
d.MyUserInfo = (DAL.UserInfo)System.Web.HttpContext.Current.Session["UserInfo"];
return d;
}
}
{
public static T GetIData<T>() where T : DAL.IData, new()
{
var d = new T();
//从Session获取UserInfo 并赋值给新创建的d
d.MyUserInfo = (DAL.UserInfo)System.Web.HttpContext.Current.Session["UserInfo"];
return d;
}
}
调用实例: 例如调用TestData.TestMethod
Proxy.GetIData<TestData>().TestMethod("测试多租户");