Domanda

Ho un interfaccia che ho usato StructureMap a Dipendenza Inject .

public interface IFileStorageService
{
    void SaveFile(string fileName, byte[] data);
}

L'interfaccia non si cura in cui i dati vengono salvati. Sia che si tratti alla memoria, un file, una risorsa di rete, un satellite nello spazio ....

Così, ho due classi che implementano questa interfaccia; un test class e un network file storage class: -

public class TestFileStorageService : IFileStorageService
{ ... etc ...}

public class NetworkFileStorageService : IFileStorageService
{
    public string NetworkUnc { get; set; }
    public void SaveFile(...);
}

Si noti come il mio NetworkFileStorageService ha una proprietà? Quella classe richiede che il valore nella sua implementazione del metodo SaveFile.

Beh, io non sono sicuro di come definire quella proprietà.

Ho pensato che avrei potuto difficile codificarlo in cui definisco la mia dipendenza (ad esempio nel mio metodo di avvio automatico -.> ForRequestedType<IFileStorageService> ... ecc), ma il kicker è .. la logica di business definisce il Posizione. Non è statica.

Infine, perché io uso le interfacce nella mia logica, questa struttura non è disponibile.

Chiunque può aiutare?

Se è possibile, immagine che si desidera salvare due file

  • Nome: Test1.bin; posizione: \ server1 \ cartella1
  • Nome: Test2.bin; posizione: \ server1 \ cartella2

evviva!

È stato utile?

Soluzione

mappa della struttura assume sono tenuti tutti gli argomenti del costruttore e le proprietà sono opzionali.

Ci sono diversi modi per risolvere questo con StructureMap. È possibile creare un metodo factory come questo

x.ForRequestedType<Func<string, IFileStorageService>>()
  .TheDefault.Is.ConstructedBy(
    () =>
    NetworkUnc  =>
    {
      var args = new StructureMap.Pipeline.ExplicitArguments();
      args.SetArg("NetworkUnc", NetworkUnc );
      return StructureMap.ObjectFactory.GetInstance<IFileStorageService>(args);
    });

ora è possibile creare l'oggetto con

StructureMap.ObjectFactory
  .GetInstance<Func<string, IFileStorageService>>()("something");

Ma quello non è che abbastanza. O creare una classe di configurazione per questa classe.

public class NetworkFileStorageServiceConfig
{
    public string NetworkUnc { get; set; }
}

e configurarlo

x.ForRequestedType<NetworkFileStorageServiceConfig>().TheDefault.Is.IsThis(
  new NetworkFileStorageServiceConfig { NetworkUnc  = "something" });

Sono sicuro che ci sono molti altri modi per farlo troppo.

Altri suggerimenti

Se questo è necessaria solo per questa implementazione che dire di mettere questo nel costruttore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top