Ich implementiere das dynamische Laden und die Registrierung meiner Assemblys in Unity IoC.Unity kann die grundlegende Abhängigkeitskette nicht auflösen
Unter diesen Klassen:
public interface IA { }
public interface IB { }
public interface IC { }
public class A : IA { }
public class B : IB
{
public B(IA a) { }
}
public class C : IC
{
public C(IB b) { }
}
Und diese Konfiguration:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
AllClasses.FromAssemblies(assembly),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.Transient);
Der Code:
var c = container.Resolve(typeof(IC));
Würfe:
Eine erste Chance Ausnahme des Typs 'Microsoft.Practices.Unity.ResolutionFailedException' aufgetreten in Microsoft.Practices.Unity.dll
Zusätzliche Informationen: Auflösung der Abhängigkeit ist fehlgeschlagen, type = "MyAsm.IC", name = "(keine)".
Ausnahme aufgetreten während: während der Auflösung.
Ausnahme ist: InvalidOperationException - Der Typ IC keine zugänglich Konstruktor hat.
Zum Zeitpunkt der Ausnahme, war der Behälter:
MyAsm.IC, (none)
Alle obigen Code wird in der gleichen Baugruppe MyAsm durchgeführt. Beim Analysieren des Containers im Debug gibt die Registrations
-Eigenschaft eine Auflistung der Zuordnungen von A
, B
und C
zu ihren jeweiligen Schnittstellen sowie zu ihnen selbst.
Irgendwelche Ideen?
SOLUTION
Nach Tylers Antwort, die ich geändert:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
zu
var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");
die das Problem gelöst. Diese beiden Methoden auf Assembly
haben dasselbe Argument und denselben Rückgabetyp und vary just slightly in behavior. Pure bösen.
diesem Mann gibt ein Bier. Die eigentliche Lösung ist noch einfacher (siehe Q), sobald Sie das Problem kennen ... –
Wow, ich war mir dieser feinen Unterscheidung nicht bewusst. Dank dafür! – TylerOhlsen