Meine Entity-Klasse hat eine Abhängigkeit von einem Repository.Wie vermeidet man, einen Verweis auf den Container zu übergeben oder CommonServiceLocator für eine EntityFactory zu verwenden
Und ich habe eine EntityFactory-Klasse, die vom Repository zum Erstellen von Entitäten verwendet wird.
public class UserRepository : IUserRepository
{
private readonly EntityFactory _entityFactory;
public UserRepository(EntityFactory entityFactory)
{
_entityFactory = entityFactory;
}
...
}
// EntityFactory #1 with no references or dependencies to DI frameworks or CommonServiceLocator
public class EntityFactory
{
public User InstantiateUser()
{
return new User(); // Requires IUserRepository parameter
}
}
// EntityFactory #2 with reference to Ninject
using Ninject;
public class EntityFactory
{
private readonly IKernel _kernel;
public EntityFactory(IKernel kernel)
{
_kernel = kernel;
}
public User InstantiateUser(IKernel kernel)
{
return new User(_kernel.Get<IUserRepository>());
}
}
// EntityFactory #3 with reference to CommonServiceLocator
using Microsoft.Practices.ServiceLocation;
public class EntityFactory
{
public User InstantiateUser()
{
return new User(ServiceLocator.Current.GetInstance<IUserRepository>());
}
}
Gibt es eine Möglichkeit, die EntityFactory mit einem Verweis auf den Behälter oder mit dem CommonServiceLocator zu vermeiden? (Context Agnostic)
Oder bin ich gerade dabei, meine Klassen falsch zu gestalten und die User-Klasse sollte nicht von Repositories abhängig sein?
Edit: Hier ist der Code der Methode von David mit:
// Ninject binding
Bind<Func<User>>().ToMethod(cxt =>() => new User(cxt.Kernel.Get<IUserRepository>()));
// EntityFactory class
private readonly Func<User> _userFactory;
public EntityFactory(Func<User> userFactory)
{
_userFactory = userFactory;
}
public User InstantiateUser()
{
return userFactory.Invoke();
}
Können Sie nicht einfach 'ServiceLocator.Current.GetInstance()' oder '_kernel.Get ()' aufrufen? –
Steven