【问题标题】:Simplest wat to integrate Unity with MVC3将 Unity 与 MVC3 集成的最简单方法
【发布时间】:2011-12-15 00:41:36
【问题描述】:

我有一个带有配置的控制台应用程序:

<?xml version="1.0" encoding="utf-8" ?> <configuration>
    <configSections>
        <section name="unity" type=
           "Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 
             Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <assembly name="UnityDi.Contracts" />
        <assembly name="UnityDi.Domain" />
        <assembly name="UnityDi.Services" />
        <assembly name="UnityDi.Repositories" />
        <namespace name="UnityDi.Contracts" />
        <namespace name="UnityDi.Domain" />
        <namespace name="UnityDi.Services" />
        <namespace name="UnityDi.Repositories" />
        <container>
            <register type="IUser" mapTo="User"></register>
            <register type="IUserService" mapTo="UserService"></register>
            <register type="IUserRepository" mapTo="UserRepository"></register>
        </container>
    </unity> 
</configuration>

和 Program.cs

namespace UnityDi.Console
{
    using System;
    using Contracts;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;

    public static class Program
    {
        private static readonly IUnityContainer Container = 
           new UnityContainer().LoadConfiguration();

        public static void Main()
        {
            var dummyUserOne = GetUserReference();

            dummyUserOne.UserId = 1;
            dummyUserOne.FullName = "Bilbo Baggins";

            var dummyUserTwo = GetUserReference();

            dummyUserTwo.UserId = 2;
            dummyUserTwo.FullName = "Frodo Baggins";

            var userService = GetUserServiceReference(); 

            userService.Add(dummyUserOne);
            userService.Add(dummyUserTwo);

            var users = userService.GetAllUsers();

            foreach (var user in users)
            {
                Console.WriteLine(user.FullName);
            }

            Console.ReadLine();
        }

        private static IUser GetUserReference()
        {
            return Container.Resolve<IUser>();
        }

        private static IUserService GetUserServiceReference()
        {
            return Container.Resolve<IUserService>();
        }
    }
}

效果很好。

我一直在进行大量搜索,发现发布的将 Unity 与 MVC3 集成的解决方案在他们的方法中似乎非常冗长。

在上述代码的上下文中(并且需要首先连接实体框架代码),我将 Unity 与 MVC3 集成并像上面那样处理我的数据的最简单方法是什么?

我想使用与上面完全相同的方法在 MVC 中创建对象。

谢谢!

理查德

附:我找到的最接近的是Unity.Mvc,但我无法让它像上面那样工作。虽然我可能很愚蠢。这对我来说是新的。

编辑:使用建议的答案。

在 MVC 应用程序的 Web.config 中(添加了 Unity.Mvc 包)

[snip]
<container>
    <register type="IUser" mapTo="User"></register>
    <register type="IUserService" mapTo="UserService"></register>
    <register type="IUserRepository" mapTo="UserRepository">
        <lifetime type="HierarchicalLifetimeManager" />
    </register>
</container>

然后在 Bootstrapper.cs 中

namespace Unity.Mvc.Resources
{
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;
    using Unity.Mvc3;

    public static class Bootstrapper
    {
        public static void Initialise()
        {
            var container = BuildUnityContainer();

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }

        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer().LoadConfiguration();

            container.RegisterControllers();

            return container;
        }
    }
}

然后在控制器中(当我意识到接口可以是任何 Unity 知道的,包括它自己的)时,有点恍惚:

private readonly IUnityContainer container;

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

public ActionResult Index()
{
    var dummyUserOne = GetUserReference();

    dummyUserOne.UserId = 1;
    dummyUserOne.FullName = "Bilbo Baggins";

    var dummyUserTwo = GetUserReference();

    dummyUserTwo.UserId = 2;
    dummyUserTwo.FullName = "Frodo Baggins";

    var userService = GetUserServiceReference();

    userService.Add(dummyUserOne);
    userService.Add(dummyUserTwo);

    var users = userService.GetAllUsers();

    return View(users);
}

private IUser GetUserReference()
{
    return container.Resolve<IUser>();
}

private IUserService GetUserServiceReference()
{
    return container.Resolve<IUserService>();
}

再一次,它有效:)

剩下的只是实体框架方面。需要在不引入额外依赖项的情况下连接 DbContext 以使用我的域对象...任何指针?真的,非常感谢。

【问题讨论】:

    标签: asp.net-mvc-3 dependency-injection unity-container


    【解决方案1】:
    1. 安装 Unity.Mvc3 nuget 包。
    2. 转到引导程序代码并添加您的映射(让它像那样工作,然后根据需要在配置文件中进行调整)
    3. 引导程序将“挂钩”到 mvc 中,让它知道控制器解析使用统一。 例如:

      container.RegisterType();

    4. 控制器的任何构造函数都会寻找统一需要在其上进行映射的任何接口。如果它必须注入 IService,它会(只要它知道)。 如果它必须在整个对象抓取过程中重复这个过程(IService 需要 IRepository 等在图表下方),只要 unity 知道它,它就会把所有东西都连接起来。

    关于实体框架的附加问题,我使用 IContext 类。在这里,我定义了 IDbSet 客户。这类似于此实现: http://leomburke.wordpress.com/category/entity-framework/

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 2014-10-02
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2019-05-03
      • 2012-07-13
      相关资源
      最近更新 更多