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

.net 如何使用sturcturemap将单个接口的两个不同实现传递到构造函数中?,.net,structuremap,ioc-container,.net,Structuremap,Ioc Container,我有一个采用两个接口的构造函数,它们是相同的接口,但需要不同的实现: public class Foo { public Foo(IBar publicData, IBar privateData) { } } 我希望structuremap将作为class PublicData和class PrivateData为不同参数传递IBar的具体实现。这可能吗 更新 事实上,为了确保有足够的信息: 我正在使用的实际类如下所示: public abstract class E

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

public class Foo
{
    public Foo(IBar publicData, IBar privateData)
    {
    }
}
我希望structuremap将作为
class PublicData
class PrivateData
为不同参数传递
IBar
的具体实现。这可能吗

更新

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

我正在使用的实际类如下所示:

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

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

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

尚未编译和测试,但原则上应该可以工作:

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"));
该约定将在扫描中应用

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

有关更多信息,请参阅SM文档中的。

尚未编译和测试,但原则上它应该可以工作:

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"));
该约定将在扫描中应用

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

有关更多信息,请参阅SM文档中的。

按如下方式设置配置:

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>();
For.Use();
For.Use();
然后按如下方式获取实例:

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>();
IBar privateData=ObjectFactory.GetInstance();
IBar publicData=ObjectFactory.GetInstance();
IFoo foo=ObjectFactory
.与(公共数据)
.带(私人酒吧)
.GetInstance();

这只是一个建议。我站在更正:-)

设置配置如下:

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>();
For.Use();
For.Use();
然后按如下方式获取实例:

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>();
IBar privateData=ObjectFactory.GetInstance();
IBar publicData=ObjectFactory.GetInstance();
IFoo foo=ObjectFactory
.与(公共数据)
.带(私人酒吧)
.GetInstance();

这只是一个建议。我的观点是正确的:-)

有没有一种方法可以应用于基于约定的系统?我不想手动连接我所有的存储库。有没有一种方法可以应用于基于约定的系统?我宁愿不必手动连接所有存储库。