使用ServiceStack IoC Container解决依赖关系

时间:2013-07-13 01:50:25

标签: dependency-injection servicestack ioc-container funq

我有一个实现MongoRepository的存储库,它使用泛型我试图在容器中注册该类型到目前为止这是我得到的:

public override void Configure(Container container)
{
    container.RegisterAutoWiredAs<UserRepository, 
        IUserRepository>();

    //Trying to wireup the internal dependencies
    container.RegisterAutoWiredType(
        typeof(MongoRepository<>),
        typeof(IRepository<>));
}

我也试过RegisterAutoWiredAs<UserRepository>

问题是当我运行应用程序时出现以下错误:

  

尝试解析服务“{ServiceName}”或其中一个时出错   自动连接的依赖项

我想是因为我注册了存储库而没有将mongoDB存储库注册为依赖项。

据我所知funq doesn't support generics,但我不确定这与ServiceStack的情况是否相同。

repo具有以下定义:

public class UserRepository
    : MongoRepository<User>, IUserRepository
{
}

public interface IUserRepository : IRepository<User>
{   
}

修改

这是服务定义,实际上非常基本!

public class MyService : Service {
    private readonly IUserRepository _userRepository;

    public MyService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public UserResponse Any(UserRequest userRequest)
    {
            //_userRepository.GetById(id)                
    }
}

的DTO:

public class UserRequest
{
    public string Id { get; set; }
}

public class UserResponse
{
    public User User { get; set; }
}

1 个答案:

答案 0 :(得分:4)

Funq非常直观地工作,即无论你注册什么,你都可以解决。因此,只需确保您要解决的问题与您注册的内容相同。

Funq中没有神奇的行为,所以这是一个不起作用的例子:

container.RegisterAutoWiredType(typeof(MongoRepository<>), typeof(IRepository<>));

如果您希望能够解析MongoRepository<User>,则需要注册,例如:

container.RegisterAutoWiredAs<MongoRepository<User>,IUserRepository>();

然后您可以像普通依赖一样自由解决:

public class MyService : Service
{

    private readonly IUserRepository _userRepository;

    public MyService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }
 }