| 

.NET C# Java Javascript Exception

3
Heyho Mitkämpfer,

ich habe eine Schnittstelle 'IPartnerRepository' zweimal implementiert und möchte nun, je nach Datenquelle, in der Lage sein, die eine oder die andere Implementierung mit Unity Dependency Injection zu binden. Dafür habe ich in der Web.config-Konfigurationsdatei die Registrierung folgendermaßen vorgenommen:

<register type="IPartnerRepository" mapTo="DB2PartnerRepository" name="DB2"/>
<register type="IPartnerRepository" mapTo="SQLPartnerRepository" name="SQL"/>


Den Container habe ich im Event-Handler 'Application_Start' konfiguriert:

var container = new UnityContainer();
container.AddNewExtension<EnterpriseLibraryCoreExtension>();
container.LoadConfiguration();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));


Hier die Klasse 'UnityDependencyResolver':

public class UnityDependencyResolver : IDependencyResolver
{
readonly IUnityContainer _container;

public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}

public object GetService(Type serviceType)
{
return (serviceType.IsClass && !serviceType.IsAbstract && !serviceType.IsInterface) || _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
}

public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType);
}
}



Bei der Initialisierung von meinem Controller, wird der 'namenlose' Container automatisch injiziert.

public class PartnerController : Controller
{
private readonly IPartnerRepository _repository;

public PersonController(PartnerRepository repository)
{
_repository = repository;
}

public ActionResult Index()
{
var partners = (List<Partner>)_repository.GetSomePartners();
return View(partners);
}
}
}


Nun hätte ich auch die Möglichkeit, den Container so zu instanzieren:

var repository = DependencyResolver.Current.GetService<IPartnerRepository>();


So weit, so gut, aber die Frage ist, wie kann ich auf die 'named' Repositories zugreifen? Die GetService-Methode nimmt nämlich keinen Parameter auf.


Gruß.

Eduardo.
News:
13.02.2011
pesalvador 33 3
1 Antwort
3
Du musst beim Abfragen des IParnerRepository über das IUnityContainer interface gehen. Dein IDependencyResolver interface unterstützt nämlich nicht die

T Resolve<T>(string name);

Methode, welche das IUnityContainer interface aber unterstützt. Du kannst natürlich auch das IDependencyResolver entsprechend erweitern.
13.02.2011
Marvin Steppat 4,0k 1 4 8
Hey Marvin,

danke für Dein Tipp. Hat nun alles geklappt, wie ich es mir vorgestellt habe.

Gruß.
pesalvador 19.02.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH