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;
}

希望对您有所帮助