2012-04-06 8 views
0

Ich arbeite mit Autofac. Bis jetzt habe ich alle meine Abhängigkeiten mit der Konstruktorinjektion gelöst.inject Verhalten auf manuell erstellte Objekte

Es gibt einen Fall, wo ich steckt:

die gegebene Kundenklasse Betrachtet:

public class Customer : ICustomer 
{ 
    public string Name { get; set; } 

    private int ExternId { get; set; } 

    public IExternalIdProvider externalIdProvider { get; set; } 

    public Customer() 
    { 
      this.externalIdProvider = new ConcreteIdProvider(this); 
    } 

    public BevorSave() 
    { 
     this.ExternId = externalIdProvider.GetNextId(); 
    } 
} 

Um einen neuen Kundenobjekt auf einer Anfrage oder gui Aktion basierte. Ich benutze den neuen Operator. Jedoch - Es gibt einen IdProvider innerhalb der CustomerClass, die ich injizieren möchte. (als Eigentum).

Wenn der Kunde würde von der IOC-Container gelöst werden, würde ich eine Konfiguration wie verwenden:

builder.RegisterType<ConcreteIdProvider>().As<IExternalIdProvider>(); 
builder.RegisterType<Customer>().As<ICustomer>() 
     .OnActivated(ae => 
      { 
       IExternalIdProvider idProvider = 
       ae.Context.Resolve<IExternalIdProvider>(TypedParameter.From(ae.Instance)); 
       ae.Instance.externalIdProvider = idProvider; 
      }); 

Meine Frage ist: Wie kann ich das Verhalten des ExternalIdProvider im Kunden injizieren? (Mit Autofac)

Dieser Artikel zeigt ein Beispiel, wie dies mit einem Service-Locator erfolgen würde: http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

Vielen Dank für Ihre Hilfe.

+0

Sie müssen möglicherweise klären, was Sie mit einem [nicht funktionsfähigen] Code-Snippet zu tun versuchen. Wenn Sie nur Eigenschaften injizieren möchten, können Sie die Funktion PropertiesAutowired von Autofac verwenden, wenn Sie den Kunden registrieren ... aber ich vermute, dass Sie nicht danach streben. Das Beispiel, mit dem Sie verlinkt haben, zeigt die Verwendung von PostSharp für die aspektorientierte Programmierung. Das ist der Schlüssel zu diesem Beispiel - nicht das Abhängigkeitsauflösungs-Framework. –

Antwort

0

Sie sollten das Verhalten Ihrer Entitäten überdenken. Verhalten in Ihren Entitäten zwingt Sie dazu, Abhängigkeiten in sie zu injizieren, und dies führt zu einer peinlichen Situation, die Sie bereits bemerkt haben. Werfen Sie einen Blick auf this related SO question and Mark Seemann's great answer.

Anstatt diese Operationen auf die Customer Klasse zu übertragen, verschieben Sie sie in eine repository Klasse. Andere Muster zum Betrachten sind unit of work, commands und queries.

Verwandte Themen