首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MVC统一2.0 Web.config设置

用MVC统一2.0 Web.config设置
EN

Stack Overflow用户
提问于 2010-10-13 14:55:48
回答 3查看 6.3K关注 0票数 3

我试图在当前的项目中使用Unifi2.0,并在web.config文件中配置参数注入时遇到了问题。

我现在拥有的是:

1)家庭控制器:

代码语言:javascript
复制
public class HomeController : Controller
{
    IRepository repository = null;

    public HomeController()
    {
       // Always calls this constructor. Why? 
       // Should be calling the constructor below that takes IRepository.
    }

    public HomeController(IRepository repository)
    {
        // Should be calling this constructor!!!
        this.repository = repository;
    }
    public ActionResult Index()
    {
        List<int> intList = this.repository.GetInts();

        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

具有两个构造函数的基本控制器。第一个人不接受争论,第二个人把IRepository作为一个论点(这应该是由统一注入的)

2) SQL存储库

代码语言:javascript
复制
public class SQLRepository : IRepository
{
    private string connectionString = null;

    public SQLRepository(string connectionString)
    {
        this.connectionString = connectionString;
    }

    #region IRepository Members

    public List<int> GetInts()
    {
        return new List<int>() { 1, 2, 3, 4, 5 };
    }

    #endregion
}

未来将成为SQL存储库,但目前它只是实现了IRepository接口的一个成员,即GetInts(),并返回一个整数列表。

3) IRepository Interace

代码语言:javascript
复制
public interface IRepository
{
    List<int> GetInts();
}

一个接口。

4) Application_Start()事件在Global.asax文件.

代码语言:javascript
复制
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        IUnityContainer container = new UnityContainer();

        UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
        section.Configure(container, "Default");
    }

它用于从web.config文件中读取Unity2.0配置,以便注册和映射类型等。

6) web.config中的Unity2.0配置部分

代码语言:javascript
复制
<unity>
<typeAliases>
  <typeAlias alias="string" type="System.String, mscorlib" />
  <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
  <typeAlias alias="IRepository" type="NewMVCApp.Interfaces.IRepository, NewMVCApp" />
  <typeAlias alias="SQLRepository" type="NewMVCApp.Repository.SQLRepository, NewMVCApp" />
</typeAliases>
<containers>
  <container name="Default">
    <types>
      <type type="IRepository" mapTo="SQLRepository">
        <lifetime type="singleton" />
        <constructor>
          <param name="connectionString">
            <value value="ApplicationServices" />
          </param>
        </constructor>
      </type>
    </types>
  </container>
</containers>

这是我使用的Unity2.0配置部分。如您所见,typeAlias用于IRepository和SQLRepository类,然后将IRepository映射到SQLRepository。因此,每当请求IRepository时,都会提供SQLRepository实例。另外,我希望通过构造函数将一个连接字符串传递给我的SQLRepository。

那么,我想做什么呢?

我试图使用Unity2.0将IRepository (SQLRepository)的实例传递给我的HomeController。但出于某种原因,将调用HomeController()的默认无参数构造函数。但是HomeController(IRepository存储库)从未被调用过。我非常肯定,我没有在web.config文件中正确地设置这些内容。但我不知道如何正确设置,以便调用HomeController上的正确构造函数。(请帮助:)

&谢谢:)

EN

回答 3

Stack Overflow用户

发布于 2010-10-13 16:17:43

您的统一配置看起来很好。问题是,您还没有将Unity框架连接起来,所以这个框架没有使用容器来创建控制器,相反,MVC使用的是调用默认构造函数的默认逻辑。

你需要两样东西。首先是IControllerFactory的实现。我通常用这个:

代码语言:javascript
复制
public class UnityControllerFactory : DefaultControllerFactory
{
    private readonly IUnityContainer container;

    public UnityControllerFactory(IUnityContainer container)
    {
        this.container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if(controllerType != null)
            return container.Resolve(controllerType) as IController;
        return base.GetControllerInstance(requestContext, controllerType);
    }
}

其次,您需要告诉MVC框架使用这个控制器工厂,而不是它的默认工厂。您可以在Application_Start处理程序中这样做。这样做:

代码语言:javascript
复制
ControllerBuilder.Current.SetControllerFactory(
    new UnityControllerFactory(container));

一旦您这样做了,您的控制器将通过容器创建,并且一切都应该开始工作。

票数 5
EN

Stack Overflow用户

发布于 2010-10-13 19:15:40

非常感谢克里斯!!就这样了!下面是使用Unity2.0的Application_Start()事件在MVC2中的样子:

代码语言:javascript
复制
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        IUnityContainer container = new UnityContainer();

        IControllerFactory controllerFactory = new UnityControllerFactory(container);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);

        // Do the line below only if you want to Register IoC programatically
        //container.RegisterType<IRepository, SQLRepository>(new ContainerControlledLifetimeManager());

        UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
        section.Configure(container, "Default");
    }
票数 1
EN

Stack Overflow用户

发布于 2015-04-22 12:57:17

尝试使用Unity.Mvc nuget套餐。您可以在container.LoadConfiguration();类中使用UnityConfig

代码语言:javascript
复制
public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.LoadConfiguration();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}

然后,您可以按如下所示更新web.config。

代码语言:javascript
复制
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity configSource="unity.config" />

完整的文章可以找到@ MVC 5与

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3925019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档