我在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();
}
答案 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的任何部分访问静态值。