gpt4 book ai didi

dependency-injection - 如何使用 ASP.NET MVC 3 RTM 配置依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 22:25:03 24 4
gpt4 key购买 nike

我正在将一个 Web 应用程序从 ASP.NET 3 Preview 1 升级到 RTM,我对依赖注入(inject)的更新方法感到困惑。我为此使用 StructureMap ,但这与我的问题并不相关。以前我需要做的事情如下:

x.For<IControllerFactory>().Use<DefaultControllerFactory>();
x.For<IServiceLocator>().Use(MvcServiceLocator.Current);

现在看来我需要提供 IControllerActivator、IViewPageActivator 和 ModelMetadataProvider 的实现,否则我会从 StructureMap 收到错误,因为 MVC 尝试使用依赖解析器来定位它们。从 MVC 源代码来看,似乎没有公共(public)默认实现。我在设置这些时遗漏了什么?当然这些应该按惯例配置吗?

需要配置什么以及如何使用 StructureMap 的示例将不胜感激。作为引用,我目前正在使用以下丑陋的组合,它强制 MVC 使用其内部默认值:
x.For<IControllerFactory>().Use<DefaultControllerFactory>();
x.For<IDependencyResolver>().Use(() => DependencyResolver.Current);
x.For<IControllerActivator>().Use(() => null);
x.For<IViewPageActivator>().Use(() => null);
x.For<ModelMetadataProvider>().Use(ModelMetadataProviders.Current);

编辑:为了清楚起见,我有一个依赖解析器的 StructureMap 实现——问题是为什么 MVC 提示所有这些接口(interface)都没有在容器中配置。

最佳答案

通过创建一个 Dependency Resolver(IDependencyResolver) 类,然后在 global.asax 中注册该类,我能够让 StructureMap 与 ASP.NET MVC3 一起使用。我还没有完全测试过这段代码。但是,它在两个应用程序中一直没有任何问题。

StructureMapDependencyResolver.cs

using System.Linq;
using System.Web.Mvc;
using StructureMap;

namespace SomeNameSpace
{
public class StructureMapDependencyResolver : IDependencyResolver
{
private readonly IContainer container;

public StructureMapDependencyResolver(IContainer container)
{
this.container = container;
}

public object GetService(System.Type serviceType)
{
try
{
return this.container.GetInstance(serviceType);
}
catch
{
return null;
}
}

public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType)
{
return this.container.GetAllInstances<object>()
.Where(s => s.GetType() == serviceType);
}
}
}

全局.asax.cs
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

}

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

DependencyResolver.SetResolver(new StructureMapDependencyResolver(InitContainer()));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

private static IContainer InitContainer()
{
ObjectFactory.Initialize(x =>
{
x.Scan(y =>
{
y.WithDefaultConventions();
y.AssembliesFromApplicationBaseDirectory();
y.LookForRegistries();
});
});

return ObjectFactory.Container;
}

关于dependency-injection - 如何使用 ASP.NET MVC 3 RTM 配置依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com