0

您好,提前感谢您的帮助。

我有一个关于如何在我的 MVC3 应用程序中构建 Unity 的问题。

目前我已经从这个有用的示例代码中对我的 Unity 实现进行了建模:

http://kevww.wordpress.com/2012/01/04/dependency-injection-with-unity-2-0-in-mvc-3/

我可以让它正常工作,但我问自己是否有稍微不同的方法。本质上,该解决方案需要两个类,第一个是依赖解析器。

public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer _container;

public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}

public object GetService(Type serviceType)
{
object instance;
try
{
instance = _container.Resolve(serviceType);
if (serviceType.IsAbstract || serviceType.IsInterface)
{
return null;
}
return instance;
}
catch (Exception e)
{
return null;
}
}

public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType);
}
}

还有一个 Unity 容器设置类,其设置来自 Global.asax:

public class UnityContainerSetup
{
public static void SetUp()
{
var container = new UnityContainer();
container.RegisterType<ISomeService, SomeService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}

好的,所以我的问题。有没有更好的方法来实际解耦这个 Unity 实现?

我创建了一个单独的项目并将上面的两个类放在其中。在我System.Web.Mvc在那个新项目中引用来解决IDependencyResolver.

但是,如果我想重用一个通用程序集来使用来自其他东西的 Unity,例如使用相同存储库和 DAL 的 Web 窗体应用程序,这似乎也没有多大意义。

或者,这只是让 Unity 工作所需的管道吗?即,如果我在我的各种项目中更改了我的 Unity 实现,我将不得不依次访问每个项目?或者我的方法是否适合中间妥协?

对我来说,明显的问题是它IDependencyResolver是 MVC 的一部分。所以我不确定如何为 MVC 完成统一的“通用”组装。

4

1 回答 1

1

您将始终需要容器设置,但您可以创建一个 ControllerFactory 并将其注册到 MVC,而不是直接使用 DependencyResolver。有关Unity 的示例,请参见此处。

这允许您将所有依赖项和分辨率保留在 Controller 中,并且您传递给表示层的任何内容都应该是平面模型或简单的视图数据。

于 2012-07-17T04:04:02.077 回答