【发布时间】: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