我正在使用Unity来初始化我的控制器实例.仍然得到上述错误.
这是我的控制器.
public class SiteController : Controller { private ISiteRepository _repository; public SiteController(ISiteRepository repository) { _repository = repository; } // // GET: /Site/ public ActionResult Index() { return View(); } // // GET: /Site/Details/5 public ActionResult Details(int id) { return View(); }}
这里是我的Global.asax.cs
protected void Application_Start() { ConfigApi(GlobalConfiguration.Configuration); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } static void ConfigApi(HttpConfiguration config) { var unity = new UnityContainer(); unity.RegisterType<SiteController>(); unity.RegisterType<ISiteRepository,SiteRepository>(new HierarchicalLifetimeManager()); config.DependencyResolver = new IocContainer(unity); }
这是我的SiteRepository类.
public class SiteRepository:ISiteRepository { private readonly SampleMVCEntities _dbContext; public SiteRepository() { _dbContext = new SampleMVCEntities(); } private IQueryable<SiteConfig> MapSiteConfig() { return _dbContext.SiteConfigs.Select(a => new SiteConfig { Name = a.Name,LinkColour = a.LinkColour,Sitelogo = a.Sitelogo,SiteBrands = a.SiteBrands.Select(b => new Models.SiteBrand { SiteId = b.SiteId,BrandId = b.BrandId }) }); } public IEnumerable<SiteConfig> GetAll() { return MapSiteConfig().AsEnumerable(); }}
这是我的错误堆栈.
没有为此对象定义的无参数构造函数.
说明:在执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误的更多信息及其在代码中的位置.
Exception Details: System.MissingMethodException: No parameterless
constructor defined for this object.Source Error:
An unhandled exception was generated during the execution of the
current web request. Information regarding the origin and location of
the exception can be identified using the exception stack trace below.Stack Trace:
[MissingMethodException: No parameterless constructor defined for this
object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type,
Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,
RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean
skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark) +114
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,
Boolean skipCheckThis,StackCrawlMark& stackMark)
+232 System.Activator.CreateInstance(Type type,Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +6 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext
requestContext,Type controllerType) +55[InvalidOperationException: An error occurred when trying to create a
controller of type ‘Config.Controllers.SiteController’. Make sure that
the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext
requestContext,Type controllerType) +179
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext
requestContext,Type controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext
requestContext,String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase
httpContext,IController& controller,IControllerFactory& factory)
+197 System.Web.Mvc.<>c_DisplayClass6.b_2() +49 System.Web.Mvc.<>c__DisplayClassb1.<ProcessInApplicationTrust>b__a()
1 func) +88
+13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action
action) +22
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase
httpContext,AsyncCallback callback,Object state) +98
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,
AsyncCallback callback,Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext
context,AsyncCallback cb,Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
+268 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously) +155
有人可以帮我吗
谢谢.
解决方法
对于从Controller得到的“常规”MVC控制器,您需要使用DependencyResolver.SetResolver:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
对于由ApiController派生的Wep API控制器,您需要像代码中一样使用GlobalConfiguration.Configuration.DependencyResolver.
所以如果你打算使用这两种类型的控制器,你需要注册你的容器两次.
有一个很好的文章如何为依赖解析器设置Unity:
Dependency Injection in ASP.NET MVC 4 and WebAPI using Unity