最简单的将Unity与MVC3集成在一起

时间:2011-12-15 00:41:37

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

我有一个配置控制台app:

<?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集成并使用上述数据的SIMPLEST方式是什么?

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

谢谢!

理查德

P.S。我找到的最接近的是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连接到我的Domain对象,而不会引入额外的依赖...任何指针?真的,非常感谢。

1 个答案:

答案 0 :(得分:3)

  1. 安装Unity.Mvc3 nuget包。
  2. 转到bootstrapper代码并添加你的映射(让它像那样工作然后如果你愿意的话,在配置文件中进行操作)
  3. 引导程序将“挂钩”到mvc中,让它知道控制器分辨率使用unity。 例如:

    container.RegisterType&lt; ICustomerRepository,CustomerRepository&gt;();

  4. 控制器的任何构造函数都将查找Unity需要进行映射的任何接口。如果它必须注入IService,它将(只要它知道它)。 如果必须在整个对象抓取过程中重复这个过程(IService需要IRepository等等,只要团结知道它,它就会将所有内容连接起来。

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