我有一个配置控制台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对象,而不会引入额外的依赖...任何指针?真的,非常感谢。
答案 0 :(得分:3)
引导程序将“挂钩”到mvc中,让它知道控制器分辨率使用unity。 例如:
container.RegisterType&lt; ICustomerRepository,CustomerRepository&gt;();
控制器的任何构造函数都将查找Unity需要进行映射的任何接口。如果它必须注入IService,它将(只要它知道它)。 如果必须在整个对象抓取过程中重复这个过程(IService需要IRepository等等,只要团结知道它,它就会将所有内容连接起来。
关于实体框架的其他问题,我使用IContext类。在这里,我定义了IDbSet客户。这与此实现类似: http://leomburke.wordpress.com/category/entity-framework/