Unity 依赖注入仅在注入 MVC 控制器时有效?
Unity Dependency Injection only working when injecting into MVC Controller?
我希望将服务注入我创建的自定义 class> 我一直在使用依赖注入将相同的服务注入我的 WebApi 控制器,但似乎无法理解为什么它在我的 "InputDataValidationModel" class
这就是我想要做的:
public class InputDataValidationModel
{
private ISec300_EE_SubmissionRepository _service { get; set; }
public InputDataValidationModel(ISec300_EE_SubmissionRepository service)
{
_service = service;
}
}
在 Global.asax 中,我注册了如下类型:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureApi(GlobalConfiguration.Configuration);
}
void ConfigureApi(HttpConfiguration config)
{
var unity = new UnityContainer();
// Register the Controllers that should be injectable
unity.RegisterType<SEC300_EE_SubmissionController>();
unity.RegisterType<InputDataValidationModel>();
unity.RegisterType<ISec300_EE_SubmissionRepository, Sec300_EE_SubmissionRepository>(new ContainerControlledLifetimeManager());
unity.RegisterType<IClientRepository, ClientRepository>(new ContainerControlledLifetimeManager());
// Finally, override the default dependency resolver with Unity
config.DependencyResolver = new IoCContainer(unity);
}
我无法具体理解的是,这在我的控制器中完成后效果很好:
public class SEC300_EE_SubmissionController : ApiController
{
private ISec300_EE_SubmissionRepository _service;
public SEC300_EE_SubmissionController(ISec300_EE_SubmissionRepository service)
{
if (service == null)
{
throw new ArgumentNullException("service");
}
_service = service;
}
}
它不起作用,因为控制器是由 Web API
实例化的,当 Web API 创建控制器时,它会调用 BeginScope,它是调用 IoC 的入口点并继续解析和构造对象给你。
在你的情况下 InputDataValidationModel
没有被使用,可能是因为这个原因你没有实例
更新
Do you perhaps have any suggestions on how i would inject my service into InputDataValidationModel ?
选项 1
您可以使用 IDependencyResolver
看看这个 link 与 Unity 容器的依赖关系解析`'
之后您可以像这样解决您的服务
var instance =GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof (InputDataValidationModel));
选项 2
你可能会使用服务定位器,即使它是一个反模式
static void Main(string[] args)
{
UnityServiceLocator locator = new UnityServiceLocator(ConfigureUnityContainer(
ServiceLocator.SetLocatorProvider(() => locator);
var a = ServiceLocator.Current.GetInstance<IFoo>();
var b = ServiceLocator.Current.GetInstance<IFoo>();
Console.WriteLine(a.Equals(b));
}
private static IUnityContainer ConfigureUnityContainer()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager());
return container;
}
希望对您有所帮助
我希望将服务注入我创建的自定义 class> 我一直在使用依赖注入将相同的服务注入我的 WebApi 控制器,但似乎无法理解为什么它在我的 "InputDataValidationModel" class
这就是我想要做的:
public class InputDataValidationModel
{
private ISec300_EE_SubmissionRepository _service { get; set; }
public InputDataValidationModel(ISec300_EE_SubmissionRepository service)
{
_service = service;
}
}
在 Global.asax 中,我注册了如下类型:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureApi(GlobalConfiguration.Configuration);
}
void ConfigureApi(HttpConfiguration config)
{
var unity = new UnityContainer();
// Register the Controllers that should be injectable
unity.RegisterType<SEC300_EE_SubmissionController>();
unity.RegisterType<InputDataValidationModel>();
unity.RegisterType<ISec300_EE_SubmissionRepository, Sec300_EE_SubmissionRepository>(new ContainerControlledLifetimeManager());
unity.RegisterType<IClientRepository, ClientRepository>(new ContainerControlledLifetimeManager());
// Finally, override the default dependency resolver with Unity
config.DependencyResolver = new IoCContainer(unity);
}
我无法具体理解的是,这在我的控制器中完成后效果很好:
public class SEC300_EE_SubmissionController : ApiController
{
private ISec300_EE_SubmissionRepository _service;
public SEC300_EE_SubmissionController(ISec300_EE_SubmissionRepository service)
{
if (service == null)
{
throw new ArgumentNullException("service");
}
_service = service;
}
}
它不起作用,因为控制器是由 Web API
实例化的,当 Web API 创建控制器时,它会调用 BeginScope,它是调用 IoC 的入口点并继续解析和构造对象给你。
在你的情况下 InputDataValidationModel
没有被使用,可能是因为这个原因你没有实例
更新
Do you perhaps have any suggestions on how i would inject my service into InputDataValidationModel ?
选项 1
您可以使用 IDependencyResolver
看看这个 link 与 Unity 容器的依赖关系解析`'
之后您可以像这样解决您的服务
var instance =GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof (InputDataValidationModel));
选项 2 你可能会使用服务定位器,即使它是一个反模式
static void Main(string[] args)
{
UnityServiceLocator locator = new UnityServiceLocator(ConfigureUnityContainer(
ServiceLocator.SetLocatorProvider(() => locator);
var a = ServiceLocator.Current.GetInstance<IFoo>();
var b = ServiceLocator.Current.GetInstance<IFoo>();
Console.WriteLine(a.Equals(b));
}
private static IUnityContainer ConfigureUnityContainer()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager());
return container;
}
希望对您有所帮助