C# 在运行时注册自定义控制器
我有一些api控制器,我想在运行时在我的mvc应用程序中注册。 控制器本身驻留在类库项目中,如下所示:C# 在运行时注册自定义控制器,c#,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net Mvc,Dependency Injection,Unity Container,我有一些api控制器,我想在运行时在我的mvc应用程序中注册。 控制器本身驻留在类库项目中,如下所示: public class CustomController : ApiController { public string Get() { return "Hello"; } } 我编译了这个库(给它起了一个名字Injection.dll),在我的mvc应用程序中,尝试通过Unity.mvc库容器注册这些控制器 public static
public class CustomController : ApiController
{
public string Get()
{
return "Hello";
}
}
我编译了这个库(给它起了一个名字Injection.dll
),在我的mvc应用程序中,尝试通过Unity.mvc库容器注册这些控制器
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
Assembly customLogicAssembly = Assembly.LoadFrom(HttpContext.Current.Server.MapPath("~/bin/" + "Injection.dll"));
Type existingType = customLogicAssembly.GetTypes().First();
container.RegisterType(existingType);
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
公共静态类UnityConfig
{
公共静态无效注册表组件()
{
var container=new UnityContainer();
//在此处向容器注册所有组件
//无需注册控制器
//例如container.RegisterType();
Assembly customLogicAssembly=Assembly.LoadFrom(HttpContext.Current.Server.MapPath(“~/bin/”+“Injection.dll”);
类型existingType=customLogicAssembly.GetTypes().First();
container.RegisterType(existingType);
SetResolver(新UnitedDependencyResolver(容器));
}
}
所以看起来注册工作正常,调试时没有错误,但是
我没有预期的结果,当我导航到api/Custom/Get时,我有一个资源找不到。
浏览器中出现错误。
请帮我解决我在这里错过的问题。MVC和Web API都有自己的依赖项解析程序 您的代码正在注册MVC依赖解析程序:
DependencyResolver.SetResolver(yourResolver);
您需要注册的是Web API依赖项解析器,如下所示:
GlobalConfiguration.Configuration.DependencyResolver = yourResolver;
在这两种情况下,预期的冲突解决程序都必须实现idependencysolver
,但其用途不同
不建议您为这两件事共享相同的依赖项解析程序(因此容器和组合根)。如果需要,请使用idependencysolver
的两个不同实例,并在它们所属的位置注册控制器
重要提示
有两个不同的idependencysolver
接口,一个用于MVC,另一个用于Web API。它们具有相同的名称,但位于不同的名称空间中。并且您需要为每种情况实现适当的DI(或者,如果您需要为MVC和Web API实现DI,则两者都需要):