【问题标题】:Ninject Factory Custom Instance ProviderNinject Factory 自定义实例提供程序
【发布时间】:2012-04-02 20:17:24
【问题描述】:

我正在使用 Ninject Factory Extension 并创建 wiki 中解释的自定义实例提供程序:

class UseFirstArgumentAsNameInstanceProvider : StandardInstanceProvider
{
    protected override string GetName(System.Reflection.MethodInfo methodInfo, object[] arguments)
    {
        return (string)arguments[0];
    }

    protected override Parameters.ConstructorArgument[] GetConstructorArguments(System.Reflection.MethodInfo methodInfo, object[] arguments)
    {
        return base.GetConstructorArguments(methodInfo, arguments).Skip(1).ToArray();
    }
}

我已经定义了以下工厂接口:

interface IFooFactory
{
    IFoo NewFoo(string template);
}

我创建了以下绑定:

kernel.Bind<IFooFactory>().ToFactory(() => new UseFirstArgumentAsNameInstanceProvider());
kernel.Bind<IFoo>().To<FooBar>().Named("Foo");

现在,当我调用以下命令时,我将得到一个 FooBar 的实例:

var foobar = fooFactory.NewFoo("Foo");

这一切都很好。然而,我想要的是更像这样的东西:

interface IFooTemplateRepository
{
     Template GetTemplate(string template);
}

我有一个存储库,它将根据名称(“Foo”)返回一个模板,我想将模板作为构造函数参数传递。

public class FooBar
{
    public FooBar(Template template)
    {
    }
}

这可能吗?我不确定什么应该依赖于 ITemplateRepository。

【问题讨论】:

    标签: ninject ninject-extensions


    【解决方案1】:

    不要使用 IoC 容器来创建实体实例。这是业务逻辑,因此它不属于组合根。处理此问题的正确方法是直接使用 ORM(例如,使用您正在使用的存储库模式)。

    var template = this.templateRepository.Get("SomeTemplate");
    var fooBar = this.fooBarFactory.CreateFooBar(template);
    

    【讨论】:

    • 我想我想多了。我可能会创建一个自定义提供程序,将第一个参数转换为模板并检查其上的属性以确定要创建的命名实例。
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多