我使用dotnet core 2.0和StructureMap.Microsoft.DependencyInjection进行IoC和依赖注入。我正在尝试创建一个代理类进行验证。我试图暗示IoC的DI在使用ComponentDataAccessorProxy
时使用IComponentDataAccessor
并且还满足ComponentDataAccessorProxy
的{{1}}依赖性并满足它的依赖性ComponentDataAccessor
没有进入循环依赖异常。我想知道是否有可能。任何帮助将不胜感激。
这是界面:
IMongoDatabase
这是具体的定义或具体类型:
public interface IComponentDataAccessor
{
Component SaveComponent(Component componentToAdd);
}
最后这是一个代理类:
public class ComponentDataAccessor : IComponentDataAccessor
{
private readonly IMongoDatabase _database;
public ComponentDataAccessor(IMongoDatabase database)
{
_database = database;
}
public Component SaveComponent(Component componentToAdd)
{
// actually save the componentToAdd
}
}
尝试失败:
public class ComponentDataAccessorProxy : IComponentDataAccessor
{
private readonly IComponentDataAccessor _componentDataAccessor;
public ComponentDataAccessorProxy(IComponentDataAccessor componentDataAccessor)
{
_componentDataAccessor = componentDataAccessor;
}
public Component SaveComponent(Component componentToAdd)
{
// do some validation here, if everything is good then call
// concrete class otherwise throw an exception
return _componentDataAccessor.SaveComponent(componentToAdd);
}
}
答案 0 :(得分:2)
根据文档here,您应该使用以下内容:
config.For<IComponentDataAccessor>().DecorateAllWith<ComponentDataAccessorProxy>();
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>();
答案 1 :(得分:0)
container.Configure(
config =>
{
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>()
.Name = "innerComponentDataAccessor";
config.For<IComponentDataAccessor>().Use<ComponentDataAccessorProxy>()
.Ctor<IComponentDataAccessor>()
.Is(c=>c.GetInstance<IComponentDataAccessor>("innerComponentDataAccessor"));
});
有一个注册表明,对于IComponentDataAccessor
使用ComponentDataAccessor
,注册时会给出一个名称,&#34; innerComponentDataAccessor&#34;。
然后&#34;真实&#34; IComponentDataAccessor
的注册使用ComponentDataAccessorProxy
。当该类的构造函数需要类型为IComponentDataAccessor
的参数时,容器将解析上一步中的命名注册。