我正在将 ASP.NET MVC3(LinqToSQL,EntityFramework)项目转换为 MVC4。我在 VS2012 中创建了一个新的 MVC4 项目,添加了包,复制了我的视图、控制器等。
除非我尝试访问使用 Respository 的控制器,否则大多数事情似乎都可以正常工作,如下所示:
public class CustomerController : Controller
{
private ICustomerRepository _cr;
public CustomerController()
{
this._cr = new CustomerRepository(TTDataProvider.DB);
}
public CustomerController(ICustomerRepository customerRepository)
{
this._cr = customerRepository;
}
如果我在 VS2012 和调试中,我会得到一个异常:“尝试获取 CustomerController 类型的实例时发生激活错误,键“””。异常类型为 Microsoft.Practices.ServiceLocation.Activation,内部异常为:“StructureMap 异常代码:202\n没有为 PluginFamily TTLW.Models.TTLWDataContext 定义默认实例,TTLW,版本=1.0.0.0,文化=中性,PublicKeyToken =空“}。
我的 IoC 代码是:
using StructureMap;
using FluentSecurity;
using System.Diagnostics;
namespace TTLW {
public static class IoC {
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.AddAllTypesOf<IPolicyViolationHandler>();
});
});
return ObjectFactory.Container;
}
}
}
这是 StructureMapMVC.cs
using System.Web.Http;
using System.Web.Mvc;
using StructureMap;
using TTLW.DependencyResolution;
[assembly: WebActivator.PreApplicationStartMethod(typeof(TTLW.App_Start.StructuremapMvc), "Start")]
namespace TTLW.App_Start {
public static class StructuremapMvc {
public static void Start() {
IContainer container = IoC.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = DependencyResolver.Current.ToServiceResolver();
}
}
}
正如我所说,这一切在我的 MVC3 应用程序中都没有问题(尽管我当然使用的是 MVC3 版本的 StructureMap)。
一旦遇到异常,如果我只是选择继续,那么一切正常(即控制器功能);这可以通过选择“Start without Debugging”而不是“Debug”来确认。当我这样做时,不会抛出异常并且事情按设计工作。
我搜索并发现了来自 Phil Haack、Brett Allred 和其他人的帖子(实际上我已经在 StructureMapMVC 的最后一行中加入了 Allred 的代码),但还没有找到解决方案。只要这个例外正盯着我看,我就不能考虑转换项目。
我已经包含了所有我认为合理的代码和消息,并希望得到任何见解。如果您需要查看更多内容,请告诉我。
提前致谢。