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)
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)