2017-08-10 72 views
0

在我追求Unity知识的过程中,我想注册一个类型作为构造函数参数的“注册类型”。如何在构造函数中注入'register typed'参数

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

我检查了我使用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

如果你想先注册'IRepository ',其次解决它,然后注册'BaseService '那dependend在'步骤2中的IRepository ',那么'InjectionConstructor'将帮助你。如果你只想在其他地方注册'IRepository '并解析'BaseService '(不在config(Bootstrapper.cs)文件中),你应该使用'DependencyOverride'作为它。它会更有用,如果你举一个例子在哪里以及如何解决'BaseService ' –

回答

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<>)); 
+0

我在VS中有一个错误消息:'UserService'必须是一个非公共无参数construtctor的非抽象类型才能使用它作为参数'T'在通用类型或方法'工厂' – Florian

+0

@弗洛里安:好的。我使用StructureMap作为DI容器,所以我们可能需要做几个实验,因为Unity的工作方式有点不同。首先,我建议注册一个新界面,例如IService 而不是BaseService 。这样做更有意义,因为BaseService 为派生类提供了共享实现细节,通常我们在DI引导期间注册合约和实现。因此,从IService 和BaseService 中派生您的UserService。从IService 派生BaseService 并不是必需的,但这取决于... – KBO

+0

我有完全相同的错误...我真的不明白。关于UserService类的定义。有一个空的构造函数: 公共UserService(IRepository 库):基地(资料库) {} – Florian

相关问题