使用 StructureMap.DependencyInjection 在 C# dotnet core 2.0 中简单代理 class 依赖注入
Simple proxy class dependency injection in C# dotnet core 2.0 using StructureMap.DependencyInjection
我正在使用 dotnet core 2.0 和 StructureMap.Microsoft.DependencyInjection 进行 IoC 和依赖注入。我正在尝试创建一个代理 class 进行验证。我试图暗示 IoC 的 DI 在使用 IComponentDataAccessor
时使用 ComponentDataAccessorProxy
并且还满足 ComponentDataAccessorProxy
依赖性 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
}
}
最后这是一个代理 class:
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);
}
}
失败的尝试:
var container = new Container();
container.Configure(config =>
{
// failed attempt #1
config.Forward<IComponentDataAccessor, ComponentDataAccessorProxy>();
// failed attempt #2
config.For<IComponentDataAccessor>().Use<ComponentDataAccessorProxy>();
});
根据文档 here,您应该使用如下内容:
config.For<IComponentDataAccessor>().DecorateAllWith<ComponentDataAccessorProxy>();
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>();
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
,并且该注册被赋予了一个名称,"innerComponentDataAccessor"。
然后 IComponentDataAccessor
的 "real" 注册使用 ComponentDataAccessorProxy
。当 class 的构造函数需要 IComponentDataAccessor
类型的参数时,容器将解析上一步中的命名注册。
我正在使用 dotnet core 2.0 和 StructureMap.Microsoft.DependencyInjection 进行 IoC 和依赖注入。我正在尝试创建一个代理 class 进行验证。我试图暗示 IoC 的 DI 在使用 IComponentDataAccessor
时使用 ComponentDataAccessorProxy
并且还满足 ComponentDataAccessorProxy
依赖性 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
}
}
最后这是一个代理 class:
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);
}
}
失败的尝试:
var container = new Container();
container.Configure(config =>
{
// failed attempt #1
config.Forward<IComponentDataAccessor, ComponentDataAccessorProxy>();
// failed attempt #2
config.For<IComponentDataAccessor>().Use<ComponentDataAccessorProxy>();
});
根据文档 here,您应该使用如下内容:
config.For<IComponentDataAccessor>().DecorateAllWith<ComponentDataAccessorProxy>();
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>();
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
,并且该注册被赋予了一个名称,"innerComponentDataAccessor"。
然后 IComponentDataAccessor
的 "real" 注册使用 ComponentDataAccessorProxy
。当 class 的构造函数需要 IComponentDataAccessor
类型的参数时,容器将解析上一步中的命名注册。