я определил один интерфейс и один класс:Ninject с общим интерфейсом
public interface IRepository<T>
{
}
public class RoleRepository:IRepository<Domain_RoleInfo>
{
}
Вводят здесь:
public RoleService
{
[Inject]
public RoleService(IRepository<Domain_RoleInfo> rep)
{
_roleRep=rep;
}
}
Как я могу выполнить Dependency Injection с Ninject, скажем, как связать?
Я написал вспомогательный класс, как показано ниже, он отлично работает с не общим интерфейсом. Но как его реорганизовать, он поддерживает общий интерфейс, как указано выше?
public class RegisterNinjectModule : NinjectModule
{
public override void Load()
{
BindServices();
BindRepositories();
}
private void BindServices()
{
FindAndBindInterfaces("RealMVC.Service.Interfaces", "RealMVC.Services");
}
private void BindRepositories()
{
FindAndBindInterfaces("RealMVC.Repository.Interfaces", "RealMVC.Repositories");
}
private void FindAndBindInterfaces(string interfaceAssemblyName, string implAssemblyName)
{
//Get all interfaces
List<Type> interfaces = Assembly.Load(interfaceAssemblyName).GetTypes().AsQueryable().Where(x => x.IsInterface).ToList();
IQueryable<Type> ts = Assembly.Load(implAssemblyName).GetTypes().AsQueryable().Where(x => x.IsClass);
foreach (Type intf in interfaces)
{
Type t = ts.Where(x => x.GetInterface(intf.Name) != null).FirstOrDefault();
if (t != null)
{
Bind(intf).To(t).InSingletonScope();
}
}
}
}
Спасибо. это именно то, что я искал, когда задавал этот вопрос - http://stackoverflow.com/questions/11702477/binding-generic-types-in-ninject-3-0. В TypeExtensions.KetBindingDefintionOf() - одна опечатка - вы должны передать 'd' вместо 'definition' при создании BindingDefinition в методе Select. – Baldy