1

ジェネリックを使用する 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}' またはその自動配線された依存関係の 1 つを解決しようとしてエラーが発生しました

mongoDBリポジトリを依存関係として登録せずにリポジトリを登録したためだと思います。

私の知る限り、funq はジェネリックをサポートしていませんが、それが ServiceStack と同じシナリオかどうかはわかりません。

レポには次の定義があります。

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; }
}
4

1 に答える 1

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;
    }
 }
于 2013-07-13T02:23:17.710 に答える