如果你正在使用MVC 3,要正確地做事情,你應該使用內置的依賴分辨率位。我強烈建議你閱讀series of blog posts from Brad Wilson(ASP.NET MVC團隊的成員)。
就StructureMap特定實現而言,我發現以下博客文章很有幫助。
StructureMap and ASP.NET MVC 3 – Getting Started
StructureMap, Model Binders and Dependency Injection in ASP.NET MVC 3
StructureMap, Action Filters and Dependency Injection in ASP.NET MVC 3
StructureMap, Global Action Filters and Dependency Injection in ASP.NET MVC 3
總之,這裏的一些代碼。首先,我建議你安裝StructureMap-MVC3 NuGet package。
我不記得它以文件的方式創建了什麼,但這裏是基本涉及的內容。
/App_Start/StructuremapMvc.cs - 此掛鉤插入的Application_Start並建立您的容器(SmIoC.Initialize()
),然後設置MVC 3 DependencyResolver到您的SmDependencyResolver
using System.Web.Mvc;
using YourAppNamespace.Website.IoC;
using StructureMap;
[assembly: WebActivator.PreApplicationStartMethod(typeof(YourAppNamespace.App_Start.StructuremapMvc), "Start")]
namespace YourAppNamespace.Website.App_Start {
public static class StructuremapMvc {
public static void Start() {
var container = SmIoC.Initialize();
DependencyResolver.SetResolver(new SmDependencyResolver(container));
}
}
}
/IOC/SmDependencyResolver。 cs - 這是您的MVC 3 IDependencyResolver實現。它在上面的App_Start代碼中使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using StructureMap;
namespace YourAppNamespace.Website.IoC
{
public class SmDependencyResolver : IDependencyResolver
{
private readonly IContainer _container;
public SmDependencyResolver(IContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
if (serviceType == null)
{
return null;
}
try
{
return _container.GetInstance(serviceType);
}
catch
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.GetAllInstances(serviceType).Cast<object>(); ;
}
}
}
/IoC/SmIoC.cs - 這就是你設置你的容器......在App_Start代碼也可使用。
namespace YourAppNamespace.Website.IoC
{
public static class SmIoC
{
public static IContainer Initialize()
{
ObjectFactory.Initialize(x =>
{
x.For<IProjectRepository>().Use<ProjectRepository>();
//etc...
});
return ObjectFactory.Container;
}
}
}
現在一切都被迷住了......(我想;-)但是你還有最後一件事情要做。在你的Global.asax
裏面,我們需要確保你處理所有的HttpContext作用域。
protected void Application_EndRequest()
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
所以你應該能夠通過構造器注入實現依賴注入,這是正確的方式去做事情。
您運行的是哪個版本的MVC? – Charlino
ASP.net MVC 3。 。 – Dismissile
如果您使用的是ASP。NET MVC 3,你應該真正利用它的內置'DependencyResolver'。查看我的答案獲取更多信息。 – Charlino