Wie kann ich Unity dazu bringen, nicht zu werfen ResolutionFailedException
wenn Resolve
versagt?
Gibt es etwas wie TryResolve<IMyInterface>
?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Wie kann ich Unity dazu bringen, nicht zu werfen ResolutionFailedException
wenn Resolve
versagt?
Gibt es etwas wie TryResolve<IMyInterface>
?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Beachten Sie auch, dass Sie bei der Verwendung von Einheit 2.0 können Sie die neue IsRegistered() Methode und ihre generische Version auch.
Dies war ein Problem auf der Codeplex-Website, finden Sie den Code hier (siehe am Ende dieses Threads und sie haben eine Erweiterung Methode gemacht ... sehr praktisch)
http://unity.codeplex.com/Thread/View.aspx?ThreadId=24543
und dann können Sie einen Code wie diesen verwenden:
if (container.CanResolve<T>() == true)
{
try
{
return container.Resolve<T>();
}
catch (Exception e)
{
// do something else
}
}
CanResolve
ist diese Erweiterungsmethode. Ich registriere diese Erweiterung bei der Erstellung des Containers...etwa so:
private void CreateContainer()
{
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = // path to config file
// get section from config code goes here
IUnityContainer container = new UnityContainer();
container.AddNewExtension<UnityExtensionWithTypeTracking>();
section.Containers.Default.Configure(container);
}
Es scheint, dass diese Funktion nicht vorhanden ist. Dieser Artikel zeigt das Beispiel für das Einschließen der Methode Resolve in den try/catch-Block, um sie zu implementieren.
public object TryResolve(Type type)
{
object resolved;
try
{
resolved = Resolve(type);
}
catch
{
resolved = null;
}
return resolved;
}
Dies ist in der aktuellen Version nicht möglich. Sie können jedoch jederzeit mit Hilfe von Erweiterungsmethoden in C# 3 "eigene Wege gehen". Sobald Unity dies unterstützt, können Sie die Erweiterungsmethode weglassen oder aktualisieren.
public static class UnityExtensions
{
public static T TryResolve<T>( this UnityContainer container )
where T : class
{
try
{
return (T)container.Resolve( typeof( T ) );
}
catch( Exception )
{
return null;
}
}
}
In Prism Unity 5 haben sie die folgende Funktion entwickelt TryResolve Funktion, die in den Namespace aufgenommen wurde Microsoft.Practices.Prism.UnityExtensions .
Bitte klicken Sie auf diesen Link https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx als Referenz.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.