首页 / C# / c# – 根据用户参数动态确定依赖关系
c# – 根据用户参数动态确定依赖关系
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 根据用户参数动态确定依赖关系,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2055字,纯文字阅读大概需要3分钟。
内容图文
![c# – 根据用户参数动态确定依赖关系](/upload/InfoBanner/zyjiaocheng/825/fd21c0cb8054452cb181e39b58882586.jpg)
问题
我目前有一个工厂,它依赖于一些参数来正确决定返回哪个对象.这家工厂还没有受到DI的约束.据我所知,NInject使用提供者作为工厂.
这是我现在拥有的.我会警告你,它不漂亮.
public interface IRole
{
string Name { get; }
}
public class FooRole : IRole
{
public string Name { get { return "Foo Role"; } }
}
public class BarRole : IRole
{
public string Name { get { return "Bar Role"; } }
}
public class FooBarRoleModule : NinjectModule
{
public override void Load()
{
Bind<IRole>().ToProvider<RoleProvider>();
}
}
public class RoleProvider : Provider<IRole>
{
protected override IRole CreateInstance(IContext context)
{
var isNewParameter = context.Parameters
.Where(x => x.Name == "isNew")
.Select(x => x.GetValue(context))
.Cast<bool>()
.FirstOrDefault();
if (isNewParameter) return new FooRole();
return new BarRole();
}
}
var role = kernel.Get<IRole>(new ConstructorArgument("isNew", true));
Console.WriteLine(role.Name);
我几乎可以肯定这不是动态注入依赖项的正确方法,但它确实有效.坦率地说,看看我一起入侵的东西似乎没有多大意义.
我需要动态解决依赖关系的原因是,在应用程序的生命周期中,最终用户可以承担多个角色.上面公布的样本非常简单,但参数(目前只有新的)将决定是否反对注入.
题
在运行时使用参数未知的提供程序的正确方法是什么?只要用户触发可以赋予它们不同角色的代码,就会传入这些参数.
谢谢.
编辑
public class RoleFactory : IRoleFactory
{
public IRole Create(bool isNew)
{
if (isNew) return new BarRole();
return new FooRole();
}
}
用Bind< IRoleFactory>()绑定它到< RoleFactory>();并像这样使用它.
var role = kernel.Get<IRoleFactory>();
Console.WriteLine(role.Create(true).Name);
这个修改后的版本确实看起来更好,更有意义,但我相信我错过了你帖子中的一些关键细节.想要添加isNew参数,如果从例如“创建新事件”按钮调用工厂,则该参数将为true.
解决方法:
Ninject提供了几种机制来处理这些问题.哪一个最适合您,取决于确切的问题.以下是最有可能的:
使用命名绑定:
kernel.Bind<IRole>().To<FooRole>().Named("old");
kernel.Bind<IRole>().To<BarRole>().Named("new");
kernel.Get<IRole>("new");
使用条件绑定
kernel.Bind<IRole>().To<AdminRole>().When(ctx => UserHasAdminPermission())
kernel.Bind<IRole>().To<UserRole>();
kernel.Get<IRole>();
内容总结
以上是互联网集市为您收集整理的c# – 根据用户参数动态确定依赖关系全部内容,希望文章能够帮你解决c# – 根据用户参数动态确定依赖关系所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。