我有一个带两个接口的构造函数,它们是相同的接口,但需要是不同的实现:
public class Foo
{
public Foo(IBar publicData, IBar privateData)
{
}
}
我想要发生的是,对于不同的参数,结构图将IBar
的具体实现传递为class PublicData
和class 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
实例时,我希望为实现提供正确的工作单元对象,在我的实例中基本上是两个不同的数据库,所以它是相同的代码,具有不同的连接字符串。
答案 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>();
这只是一个建议。我的立场得到了纠正: - )