在我对Unity知识的追求中,我希望注册一个类型为'注册类型'作为构造函数参数。
在我的Bootstrapper.cs文件中,我有这样的配置:
container.RegisterType<IRepository<User>, UserRepository>();
container.RegisterType<BaseService<User>, UserService>(); // <-- Should I inject the parameter here ?
container.RegisterType<IFactory<BaseService<User>>, Factory<UserService>>(); // <-- or here
现在这是BaseService类的实现:
public abstract class BaseService<TModel>
{
private readonly IRepository<TModel> _repository;
// Injected parameter in constructor
public BaseService(IRepository<TModel> repository)
{
_repository = repository;
}
}
我的问题是如何在BaseService构造函数中注入由此行解析的参数: container.RegisterType,UserRepository&gt;(); ?
我已经检查过我使用了InjectedParameter,但在这种情况下我不知道如何正确使用。
谢谢,
修改
这是另一个实现:
UserService:
public class UserService : BaseService<User>
{
public UserService(IRepository<User> repository) : base(repository)
{
}
}
工厂:
public class Factory<T> : IFactory<T> where T : new()
{
public T Create()
{
return new T();
}
}
答案 0 :(得分:0)
您的代码有什么问题?从我的观点来看,它应该没有修改。如果让Unity创建一个BaseService<User>
对象,它会创建一个UserService
实例。我希望定义是:
public class UserService : BaseService<User>
{
...
}
因为您已经注册了IRepository<User>
,所以解决/注入UserRepository
的实例应该没有问题。
<强>更新强>
问题是Factory<T>
类中的new()约束。 Unity(和StructureMap也)能够使用Func<>
来解析已注册的依赖项。因此,您可以更改Factory<T>
课程:
public class Factory<T> : IFactory<T>
{
private readonly Func<T> _creator;
public Factory(Func<T> creator)
{
if(creator == null)
throw new ArgumentNullException("creator");
_creator = creator;
}
public T Create()
{
return _creator();
}
}
注册该通用工厂一次:
container.RegisterType(typeof(IFactory<>), typeof(Factory<>));