Reputation: 513
I have the following set of types:
IQueryProvider
interface:
public interface IQueryProvider<TEntity, TEntityKey>
and an implementation with one generic parameter added:
public class EFQueryProvider<TContext, TEntity, TEntityKey> : IQueryProvider<TEntity, TEntityKey>.
Further, there are concrete repositories, which incapsulate generic QueryProvider. For example:
UserRepository : IUserRepository
{
private IQueryProvider<User, int> _provider;
public UserRepository(IQueryProvider<User, int> provider)
{
_provider = provider;
}
}
I'm trying to resolve the constructor parameter using Unity configuration:
<register type="IUserRepository" mapTo="ConcreteUserRepository">
<constructor>
<param ... What should be here??? />
<constructor>
</register>
How can I pass an instance of closed generic type to the constructor (So that an instance of EFQueryProvider<MySampleContext, User, int>
would be passed to the constructor? I need to do this per Repository registration, cause ArticlesRepository, for example can need another Context.
Any help appreciated.
Upvotes: 2
Views: 880
Reputation: 513
Found a solution by myself. The config should look like:
<register name="myQueryProvider" type="MyLib.IQueryProvider[[User, MyEntityLib], int], MyAnotherLib" mapTo="MyLib.EFQueryProvider[[MyContext, MyEFLib], [User, MyEntityLib], int], MyEFLib" />
and Repository registration:
<register type="IUserRepository" mapTo="UserRepository">
<constructor>
<param name="queryProvider">
<dependency name="myQueryProvider" />
</param>
</constructor>
</register>
Upvotes: 3