Skog
Skog

Reputation: 513

Configure closed generic types for Unity constructor injection

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

Answers (1)

Skog
Skog

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

Related Questions