我需要设置StructureMap和公共属性的问题

时间:2008-12-16 05:20:51

标签: .net structuremap

我有一个界面,我使用StructureMap依赖注入

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

界面不关心数据保存的位置。无论是记忆,文件,网络资源,太空卫星......

所以,我有两个实现这个接口的类; test classnetwork file storage class: -

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

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

注意我的NetworkFileStorageService有财产吗?该类需要在其中实现SaveFile方法的值。

好吧,我不确定如何定义该属性。

我认为我可以在我定义依赖关系的地方进行硬编码(例如,在我的引导程序方法中 - &gt; ForRequestedType<IFileStorageService> ...等)但是踢球者是......业务逻辑 DEFINES 位置。这不是一成不变的。

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

有人可以帮忙吗?

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

  • 姓名:Test1.bin; location:\ server1 \ folder1
  • 名称:Test2.bin; location:\ server1 \ folder2

喝彩!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

使用structuremap有几种方法可以解决这个问题。 您可以创建像这样的工厂方法

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

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