4

Ich verwende das Unity-Framework als IoC-Container.Unity - Factory via XML

Meine Config sieht einige wie folgt aus:

<unity> 
    <container> 
    <register type="Namespace1.IFoo, FooAsm" 
       mapTo="Namespace2.Bar, BarAsm"> 
    </register> 
</conainer> 

Ich mag würde, einen Behälter registrieren eine Factory-Methode zu verwenden. Wie kann ich es mit der app.config erreichen?

Ich suche so etwas wie:

<unity> 
    <container> 
    <register type="Namespace1.IFoo, FooAsm" 
       factory="Namespace2.Bar, BarAsm" 
       method="create"> 
    </register> 
    </conainer> 
</unity> 

Any suggestsions?

+1

Wechseln Sie auf Code-basierte Konfiguration, ernsthaft. Wenn Sie können, sollten Sie den Container nicht über XML konfigurieren, da er spröde und fehleranfällig ist. Code-basierte Konfiguration ist viel flexibler und bietet Ihnen Unterstützung bei der Kompilierung. – Steven

+0

Wie ist die Code-basierte Konfiguration flexibler? Entweder fügst du Reflektion hinzu oder du brauchst starke Referenzen. Beides ist nicht wirklich flexibel. – Jaster

+0

Es ist flexibler, weil Sie beispielsweise Lambda-Ausdrücke registrieren können. Was nützt es, keine starke Referenz zu haben? Da Sie den Typ in Ihrem XML-Code angeben, haben Sie implizit immer noch einen Verweis auf den Typ, aber jetzt verlieren Sie die Überprüfung der Kompilierzeit. – Steven

Antwort

4

This thread bietet eine nette Antwort darüber, wie Sie Unterstützung von Factory-Methoden für Unity hinzufügen. Tatsächlich müssen Sie this bitbucket Quelle herunterladen (und die Verweise auf 4.0 Framework ändern).
Wenn Sie jetzt hinzufügen Generic support for Unity Sie eine ziemlich genial Lösung erhalten, die wie folgt aussehen könnte:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/> 
    </configSections> 
    <unity xmlns="schemas.microsoft.com/practices/2010/unity"> 
    <sectionExtension type="Unity.FactoryConfig.FactoryConfigExtension, Unity.FactoryConfig"/> 
    <alias alias="Factory" type="Namespace1.GenericFactory`1, asm1"/> 
    <container> 
     <register type="Namespace1.ITest, asm1"> 
     <factory type="Factory[[Namespace1.ITest, asm1]]" method="Create" /> 
     </register> 
    </container> 
    </unity> 
</configuration> 

Unterstützung von generischen Fabriken für die Einheit Framework XML-Konfiguration!
Danke für alle Kommentare :)

+0

Ive für diesen Ansatz gegangen und es hat genau funktioniert, wie ich gehofft hatte. – Rob

1

Ich glaube nicht, dass es eine eingebaute Möglichkeit gibt, dies derzeit zu tun. Normalerweise registriere ich einfach die Fabrik selbst (Karte IMyFactory -nach->MyFactoryImpl), dann injiziere die Fabrik in die Klassen, die sie brauchen, und lasse die Klassen die Fabrik anrufen.

Aber ich denke, Sie können wahrscheinlich etwas machen eine Fabrik direkt aus Unity anrufen, indem Sie eine Erweiterung für Unity machen. Es gibt ein paar in den Antworten auf diese Frage erwähnt: How to create objects using a static factory method?

+1

http://stackoverflow.com/questions/3815581/microsoft-unity-issue-with-resolve <- es scheint, dass es eine Unterstützung der Fabrik gibt, aber die Beispiele, die ich gefunden habe, gehen codewise. schaffte es nicht, sie in xml noch zu übersetzen – Jaster