如何使用sturcturemap将单个接口的两个不同实现传递给构造函数?

时间:2010-09-02 14:06:23

标签: .net structuremap ioc-container

我有一个带两个接口的构造函数,它们是相同的接口,但需要是不同的实现:

public class Foo
{
    public Foo(IBar publicData, IBar privateData)
    {
    }
}

我想要发生的是,对于不同的参数,结构图将IBar的具体实现传递为class PublicDataclass PrivateData。这可能吗?

更新

事实上,要确保有足够的信息:

我正在使用的真正课程如下:

public abstract class EFRepository<T> : IRepository<T>
{
    protected EFRepository(IUnitOfWork publicUnitOfWork, 
                           IUnitOfWork privateUnitOfWork)
    {

    }
}

EFRepository的实现可能如下所示:

public partial class ClaimRepository: EFRepository<Claim>, IClaimRepository
{
    public ClaimRepository(IUnitOfWork publishedUnitOfWork, 
                          IUnitOfWork unpublisedUnitOfWork) 
           : base(publishedUnitOfWork, unpublisedUnitOfWork)
    {
    }
}

因此,当我从结构映射请求IClaimRepository实例时,我希望为实现提供正确的工作单元对象,在我的实例中基本上是两个不同的数据库,所以它是相同的代码,具有不同的连接字符串。

2 个答案:

答案 0 :(得分:1)

没有编译和测试,但原则上应该有效:

For<IBar>.Add<PublicData>.Named("public");
For<IBar>.Add<PrivateData>.Named("private");

For<IFoo>.Use<Foo>()
  .Ctor<IBar>("publicData").Is(d => d.TheInstanceNamed("public"))
  .Ctor<IBar>("privateData").Is(d => d.TheInstanceNamed("private"));

修改 为了按惯例制作,可以使用IRegistrationConvention

public class FooConvention : IRegistrationConvention
{
  static readonly Type PluginType = typeof(IFoo);

  public void Process(Type type, Registry registry)
  {
     if (type.IsAbstract || !type.IsClass || !PluginType.IsAssignableFrom(type))
       return;

      registry.For(PluginType).Add(type)
         .CtorDependency<IBar>("publicData")
         .IsNamedInstance("public")
         .CtorDependency<IBar>("privateData")
         .IsNamedInstance("private");
  }
}

该惯例将在扫描中应用

Scan(scan => 
{
  scan.AssemblyContainingType<IFoo>();
  scan.Convention<FooConvention>();
}

有关详细信息,请参阅SM文档中的Scanning Assemblies section

答案 1 :(得分:0)

按如下方式设置配置:

For<IFoo>.Use<Foo>();
For<IBar>.Use<IBar>();

然后按如下方式获取实例:

IBar privateData = ObjectFactory.GetInstance<IBar>();
IBar publicData = ObjectFactory.GetInstance<IBar>();

IFoo foo = ObjectFactory
    .With<IBar>(publicData)
    .With<IBar>(privateBar)
    .GetInstance<IFoo>();

这只是一个建议。我的立场得到了纠正: - )