首页 > 解决方案 > 在 config.DependencyResolver = new UnityResolver(container); 上出现转换错误

问题描述

我正在尝试通过统一容器在我的 web api 项目中使用依赖注入,但我得到了编译时异常

“无法将类型 'APIIntegrationApp.UnityResolver' 隐式转换为 'System.Web.Http.Dependencies.IDependencyResolver'。存在显式转换(您是否缺少演员表?)”

我指的是这个链接我的实现

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection

var container = new UnityContainer();
container.RegisterType<IMFOCustomerRepository, MFOCustomerRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);

这是我的 IDependencyResolver 接口和 unityresolver 类定义

public interface IDependencyResolver : IDependencyScope, IDisposable
{
    IDependencyScope BeginScope();
}

public interface IDependencyScope : IDisposable
{
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}

 public class UnityResolver : IDependencyResolver
{
    protected IUnityContainer container;

    public UnityResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = container.CreateChildContainer();
        return new UnityResolver(child);
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        container.Dispose();
    }
}

标签: c#dependency-injectionasp.net-web-api2unity-container

解决方案


通常会抛出此错误,因为存在类型不匹配(认为int myInt = 'some string')或特定类没有从预期的接口继承。下面的示例显示了这一点:

public interface IClassA
{
    void DoSomething();
}

public class ClassA
{
    public void DoSomething()
    {
        // do something here
    }
}

public class Program
{
    static void Main(string[] args)
    {
        IClassA obj = new ClassA(); // throws error because ClassA doesn't inherit from IClassA
    }
}

这个问题的解决方案只是继承依赖注入中常见的所需接口。


推荐阅读