如何注入'注册类型'构造函数中的参数

时间:2017-08-10 09:02:06

标签: c# unity-container

在我对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();
    }
}

1 个答案:

答案 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<>));