Unity无法解析Generic存储库

Th3*_*B0Y 6 c# unity-container repository-pattern

我看到了类似的其他问题,但它没有解决我的问题.一个问题的示例:Unity注册非泛型接口的泛型类型

我有界面

    public interface IRepository<T>
    {
        T GetById(int id);
    }
Run Code Online (Sandbox Code Playgroud)

和班级

    public class Repository<T> : IRepository<T>
    {
         public T GetById(int id)
         {
             Console.WriteLine("Type: " + GetType());
             return default(T);
         }
    }
Run Code Online (Sandbox Code Playgroud)

我注册了

    Container.RegisterType(typeof(IRepository<>), typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)

并尝试解决它

    IRepository<string> IRepository = Container.Resolve<IRepository<string>>();
Run Code Online (Sandbox Code Playgroud)

它总是返回null.

我看到了许多不同的来源,他们都表现出相同的实现方式.为什么不起作用?

UPDATE

这是实际的实现:

public class Program
{
    static Program()
    {
        DIDefaultRegisters.Initialize();
    }

    public static void Main(string[] args)
    {
        var iRepository = UnityDIFacade.Resolve<IRepository<string>>();

        iRepository.GetById(1);
    }
}

public class DIDefaultRegisters
{
    public static void Initialize()
    {
        Register(typeof(IRepository<>),typeof(Repository<>));
    }

    private static void Register(Type from, Type to)
    {
        UnityDIFacade.RegisterType(from, to);
    }
}

public class UnityDIFacade
{
    private static readonly IUnityContainer Container;

    static UnityDIFacade()
    {
        IUnityContainer container = new UnityContainer();

        var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        if (section != null)
            section.Configure(container);

        Container = container;
    }

    public static T Resolve<T>()
    {
        T resolved = default(T);

        if (Container.IsRegistered<T>()) 
            resolved = Container.Resolve<T>();

        return resolved;
    }

    public static void RegisterType(Type from, Type to)
    {
        Container.RegisterType(from, to);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jeh*_*hof 3

if (Container.IsRegistered<T>())您应该删除代码中的检查,因为这将为false您请求的每个存储库返回。IRepository<string>等具体存储库IRepository<User> 并未在容器中注册,仅在通用版本中注册IRepository<T>

如果您想返回null,请使用 try-catch-block 来Container.Resolve将resolved 设置为 null,以防发生异常。

public static T Resolve<T>()
{
    T resolved;

    //if (Container.IsRegistered<T>()) 
    try{
      resolved = Container.Resolve<T>();
    }
    catch(Exception){
      resolved = default(T);
    }
    return resolved;
}
Run Code Online (Sandbox Code Playgroud)