一个用泛型隐式传递权限关键字的方法

最近和IBM在重新做公司的平台,其中涉及多租户问题,之前处理多租户数据隔离时考虑很简单,直接把权限关键字作为每个方法的参数传递给DAO。带来的问题是在编码过程中有部分同事经常会忘记添加,维护也有些麻烦,这次就想着将这个问题给处理掉。IBM给了一个方案,可以将权限关键字写入当前执行线程中,在DAO中再从线程中取出来,但这样限定了UI层跟DAO都只能使用同一个线程,虽然暂时不会有UI层跟DAO线程不一样的情况,但总感觉有些不舒服。之前也一直在考虑是否可以通过一个公共方法来调用DAO,在公共方法中设置权限关键字,但都没有仔细的去想,今天在整理文档时突然想到用泛型不就能完美的解决这个问题么,于是就小实现了一下,是完全可以的。以下列出关键代码。

 

 DAO部分

 

public interface IData
    {
        UserInfo MyUserInfo { getset; }
    }
 public class TestData : IData
    {
        public UserInfo MyUserInfo { getset; }

        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;
        }
    }

 

 

调用实例: 例如调用TestData.TestMethod
Proxy.GetIData<TestData>().TestMethod("测试多租户");

 

posted @ 2012-07-23 17:46  二杠  阅读(1463)  评论(5编辑  收藏  举报