2011-05-09 27 views
0

我正在寻找一种方法来从使用Unity IoC容器的MVC Web应用程序动态地切换设置。ASP.NET MVC和IoC动态切换配置设置

我这是在Global.asax.cs

private static IUnityContainer _container; 

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    InitializeUnityContainer(); 
} 

配置容器的静态实例,然后自定义控制器工厂

protected override IController GetControllerInstance(
         RequestContext reqContext, Type controllerType) 
{ 
    // ... (some argument checking here) 

    return _container.Resolve(controllerType) as IController;   
} 

我们公司谁所有使用自己的数据库中不同的团队服务器(具有相同的模式)。管理员提出的解决方案是让多个Web应用程序实例运行,因此您可以选择适用于特定团队的任何URL。我宁愿只运行一个Web应用程序,让团队选择他们希望应用程序连接的数据库(以及其他配置设置)(理想情况下通过下拉菜单或某种类型的菜单)。

我有点难以忍受,但我怎么能实现这个目标。统一容器需要为每个团队配置不同(也许我需要多个静态实例?),并且需要更改控制器中直接访问的其他配置设置。我想这应该是一个相对普遍的问题,是否有标准的解决方案?

+0

可能的重复:http://stackoverflow.com/questions/1900415/what-is-the-best-way-to-dynamic-load-connection-strings – 2011-05-09 12:51:09

+0

@标记我不认为这是一个重复的所有。我的问题,据我了解,使用DI意味着我的所有连接字符串都固定在application_start上。我如何/在哪里可以查字典/用户团队或其他? Unity正在从对象根注入我的连接字符串。 – fearofawhackplanet 2011-05-09 13:12:55

+0

您需要将运行时值映射到依赖项:http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/ 1945023#1945023 – 2011-05-09 13:18:49

回答

1

我不认为托管所有团队在一个单一的应用程序将运作良好 - 任何你有那不是请求范围将无法正常工作 - 例如。任何应用程序范围的数据或静态字段都可能会导致问题,仅由第一个访问者设置,或不断重写。

最清洁的方式肯定会有多个应用程序(即使它们指向相同的代码库)。

+0

我没有想到这,这将是一个很好的解决方案。这是如何实现的?所以我想要共享所有我的DLL,视图,JS和CSS等文件,但使用不同的配置文件(可能还有其他不同的CSS文件)。那可能吗? – fearofawhackplanet 2011-05-11 10:57:38

+0

在IIS中,您可以将多个应用程序/网站指向同一个文件夹。加载不同的配置可能会更棘手,如果它在Web.config中 - 不确定是否可以根据主机头从另一个文件加载它(如果不是,则可能需要将配置封装起来,因此访问它可以检查主机头) – 2011-05-11 11:51:36