.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();
这只是一个建议。我的观点是正确的:-)有没有一种方法可以应用于基于约定的系统?我不想手动连接我所有的存储库。有没有一种方法可以应用于基于约定的系统?我宁愿不必手动连接所有存储库。