1

我有一个用于StructureMapDependency Inject的接口。

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

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

所以,我有两个实现这个接口的类;一个test class和一个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

干杯!

4

2 回答 2

0

如果只有这个实现需要这个,那么把它放在你的构造函数中呢?

于 2008-12-16T05:29:41.927 回答
0

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

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

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

我敢肯定还有很多其他方法可以做到这一点。

于 2009-11-09T10:19:29.287 回答