Dependency injection 防止解析未注册的类
Unity将解析类,即使它们未在容器中注册。是否可以更改容器配置,以便显式注册类以进行解析?您可以创建自定义生成器策略,并检查容器中是否注册了类型:Dependency injection 防止解析未注册的类,dependency-injection,inversion-of-control,unity-container,Dependency Injection,Inversion Of Control,Unity Container,Unity将解析类,即使它们未在容器中注册。是否可以更改容器配置,以便显式注册类以进行解析?您可以创建自定义生成器策略,并检查容器中是否注册了类型: class Program { static void Main(string[] args) { var container = new UnityContainer(); container.AddNewExtension<FactoryUnityExtension>();
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.AddNewExtension<FactoryUnityExtension>();
try
{
container.Resolve<Program>();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
container.RegisterType<Program>();
var v = container.Resolve<Program>();
Console.WriteLine(v);
}
}
public class CustomFactoryBuildStrategy : BuilderStrategy
{
private ExtensionContext baseContext;
public CustomFactoryBuildStrategy(ExtensionContext baseContext)
{
this.baseContext = baseContext;
}
public override void PreBuildUp(IBuilderContext context)
{
var key = (NamedTypeBuildKey)context.OriginalBuildKey;
if (baseContext.Container.Registrations.All(o => o.RegisteredType != key.Type))
{
throw new InvalidOperationException();
}
}
}
public class FactoryUnityExtension : UnityContainerExtension
{
private CustomFactoryBuildStrategy strategy;
protected override void Initialize()
{
this.strategy = new CustomFactoryBuildStrategy(Context);
Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
}
}
类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.AddNewExtension();
尝试
{
container.Resolve();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
container.RegisterType();
var v=container.Resolve();
控制台写入线(v);
}
}
公共类CustomFactoryBuildStrategy:BuilderStrategy
{
专用扩展上下文baseContext;
公共CustomFactoryBuildStrategy(扩展上下文baseContext)
{
this.baseContext=baseContext;
}
公共覆盖无效预构建(IBuilderContext上下文)
{
var key=(NamedTypeBuildKey)context.OriginalBuildKey;
if(baseContext.Container.Registrations.All(o=>o.RegisteredType!=key.Type))
{
抛出新的InvalidOperationException();
}
}
}
公共类FactoryUnityExtension:UnityContainerExtension
{
私人客户工厂建设战略;
受保护的覆盖无效初始化()
{
this.strategy=新CustomFactoryBuildStrategy(上下文);
Context.Strategies.Add(strategy,UnityBuildStage.PreCreation);
}
}
@ArturShamsutdinov您尝试过这个解决方案吗?