代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

结构映射和公共属性有问题,我需要设置

  •  1
  • Pure.Krome  · 技术社区  · 16 年前

    我有一个我用过的接口 StructureMap 依赖项注入 .

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

    界面不关心数据保存在哪里。无论是内存、文件、网络资源、空间卫星……

    所以,我有两个类来实现这个接口;a test class 和A network file storage class -

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

    注意我如何 NetworkFileStorageService 有财产吗?该类需要savefile方法的实现中的该值。

    嗯,我不知道如何定义这个属性。

    我想我可以在定义依赖项的地方硬编码它(例如,在我的引导程序方法中-> ForRequestedType<IFileStorageService> …等等),但更重要的是……业务逻辑 定义 地点。它不是静态的。

    最后,因为我在逻辑中使用接口,所以这个属性不可用。

    有人能帮忙吗?

    如果可以,图像要保存两个文件

    • 名称:test1.bin;位置:server1\folder1
    • 名称:test2.bin;位置:server1\folder2

    干杯!

    2 回复  |  直到 15 年前
        1
  •  0
  •   AndreasN    15 年前

    结构映射假定所有构造函数参数都是必需的,属性是可选的。

    有几种方法可以用结构图来解决这个问题。 您可以创建这样的工厂方法

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

    现在,您可以使用

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

    但那不是很漂亮。 或者为此类创建一个配置类。

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

    并对其进行配置

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

    我相信还有很多其他的方法可以做到。

        2
  •  0
  •   leora Matt Lacey    16 年前

    如果这个实现只需要这样做,那么把它放到构造函数中怎么样?