ASP MVC控制器和静态变量

时间:2014-09-15 05:20:07

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我在web.config中有连接字符串列表。 并且用户有他的"活跃" cookie中此列表的连接字符串。 这个cookie只能在app启动时进行查询。 所以,在每个控制器的请求中我都要写:

Request.Cookies["activeServer"].Value

并将其传递给存储库。 我认为这是糟糕的代码,我怎样才能做得更好。

public ActionResult Index()
    {

        try
        {
            var m = new HomeRepository(Request.Cookies["activeServer"].Value);
            m.Tree = m.GetObjectsTree();
            return View(m);
        }
        catch(Exception ex)
        {
            ModelState.AddModelError("error", ex);
        }
        return View();
    }

    public ActionResult Lists()
    {
        try
        {
            var m = new HomeRepository(Request.Cookies["activeServer"].Value);
            return View(m.GetListsModel());
        }
        catch(Exception ex)
        {
            ModelState.AddModelError("error",ex);
        }
        return View();
    }

2 个答案:

答案 0 :(得分:1)

在这种情况下使用依赖注入

定义功能:

public string GetConnectionString()
{
    //You should also check that cookie is no t null and value is not null...
    return Request.Cookies["activeServer"].Value;
}

您的控制器构造函数应该将存储库作为参数:

public class HomeController : Controller
{
    public IHomeRepository HomeRepo {get; private set;}
    public HomeController (IHomeRepository repo)
    { 
       this.HomeRepo = repo;
    }
}

定义存储库接口

public repository IHomeRepository
{
}

定义IHomeRepository的实现

public class HomeRepository : IHomeRepository
{
    public Func<string> _getConnectionString;

    private string _connectionString;

    public HomeRepository( Func<string> getConnectionString)
    {
       this._getConnectionString = getConnectionString
    }

    public string ConnectionString {
        get{

           if(!this._connectionString.IsNullOrEmpty())
              return this._connectionString;

           if(this._getConnectionString == null)
               throw new ArgumentNullException();

           this._connectionString = this._getConnectionString();
           return  this._connectionString;
        }
    }
}

使用一些依赖注入库将GetConnectionString函数注入HomeRepository控制器的委托

如果您决定使用SimpleInjector库,那么注入将如下所示:

container.RegisterSingle(GetConnectionString);
container.Register<IHomeRepository, HomeRepository>();

通过应用此模式,您不必在每个操作中手动创建存储库,您可以注入假/模拟存储库对象进行测试

答案 1 :(得分:0)

整个MVC应用程序的静态变量:

在其中创建包含静态属性的静态类:

public static class Dictionaries
{
    //for example
    public static ConcurrentDictionary<int, string> Statuses { get; set; }
}

使用global.asax Application_Start()方法中的值对其进行初始化。

protected void Application_Start()
{
    // other code
    new CommonDictionary().DictionariesInit();
}

初始化类的示例: 公共类CommonDictionary     {

public void DictionariesInit()
{
    Dictionaries.Statuses = new ConcurrentDictionary<int, string>(from s in new StatusDAO().GetStatuses()
     select new KeyValuePair<int, string>(s.StatusID, s.StatusName));    
}

现在,您可以从代码Controller,BLL,DAL的任何部分访问静态值。