Question

J'ai une interface que je l'ai utilisé à StructureMap Dépendance Injecter .

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

L'interface ne se soucie pas où les données sont enregistrées. Que ce soit à la mémoire, un fichier, une ressource réseau, un satellite dans l'espace ....

Alors, j'ai deux classes qui mettent en œuvre cette interface; et un test class network file storage class: -

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

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

Remarquez comment ma possède une propriété NetworkFileStorageService? Cette classe exige que la valeur dans sa mise en œuvre de la méthode SaveFile.

Eh bien, je ne suis pas sûr de savoir comment définir cette propriété.

Je pensais que je pourrais coder en dur là où je définir ma dépendance (par exemple dans ma méthode bootstrapper -.> ForRequestedType<IFileStorageService> ... etc) mais le kicker est .. la logique métier PRECISE la emplacement. Ce n'est pas statique.

Enfin, parce que j'utilise des interfaces dans ma logique, cette propriété ne sont pas disponibles.

Quelqu'un peut-il aider?

Si vous le pouvez, l'image que vous souhaitez enregistrer deux fichiers

  • Nom: Test1.bin; Lieu: \ server1 \ dossier1
  • Nom: Test2.bin; Lieu: \ server1 \ dossier2

cheers!

Était-ce utile?

La solution

carte de Structure assume tous les arguments du constructeur sont nécessaires et propriétés sont facultatives.

Il y a plusieurs façons de résoudre ce avec StructureMap. Vous pouvez créer une méthode d'usine comme celui-ci

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);
    });

vous pouvez maintenant créer votre objet avec

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

Mais c'est pas assez. Ou créer une classe de configuration pour cette classe.

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

et le configurer

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

Je suis sûr qu'il ya beaucoup d'autres façons de le faire aussi.

Autres conseils

si cela est nécessaire que par cette mise en œuvre que de mettre dans votre constructeur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top