ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 根据用户参数动态确定依赖关系

2019-05-18 14:55:20  阅读:197  来源: 互联网

标签:c dependency-injection ninject


问题

我目前有一个工厂,它依赖于一些参数来正确决定返回哪个对象.这家工厂还没有受到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,dependency-injection,ninject
来源: https://codeday.me/bug/20190518/1128837.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有