是否可以使用Property Injection与Nancyfx默认的TinyIoc容器?

时间:2015-06-24 00:58:16

标签: nancy tinyioc

是的我知道,最好使用构造函数注入,我大部分时间都使用它,但是,有一个场景,我喜欢使用Property Injection:

我有一个存储库基类,它具有数据库工厂的依赖关系以及读取应用程序设置的服务(ConfigurationManager的抽象)

public abstract class RepositoryBase(){
    public IDatabaseFactory DatabaseFactory { get; set; }
    public IAppConfigService AppConfig { get; set; }

    protected Database Db 
    {
        get
        {
            var db = DatabaseFactory.Get();
            ... not relevant code ...
            return db;
        }
    }
}

我不想在这里使用构造函数依赖项,因为这将迫使我向我的所有存储库添加构造函数,我可以这样做,但我不想这样做。更糟糕的问题是,如果由于某种原因我向RespositoryBase类添加了一个日志服务,我将不得不将这个新依赖项添加到我所有存储库类的构造函数中,这不是很酷。

我可以使用像服务聚合这样的模式来避免修改RepositoryBase类,但这看起来太复杂了,我真的很想让事情变得简单,所以每个人都可以理解发生了什么(包括我)。

那么,是否可以通过Nancy / TinyIOC注入这些依赖项?

2 个答案:

答案 0 :(得分:1)

如果我们查看TinyIoC的代码,我们将在创建对象后找到没有属性注入代码的地方:https://github.com/NancyFx/Nancy/blob/master/src/Nancy/TinyIoc/TinyIoC.cs#L3693以及原始仓库:https://github.com/grumpydev/TinyIoC/blob/master/src/TinyIoC/TinyIoC.cs#L3849

如果我们用这样的代码修补代码:

        try
        {
            object o = null;
#if USE_OBJECT_CONSTRUCTOR
            var constructionDelegate = CreateObjectConstructionDelegateWithCache(constructor);
            o = constructionDelegate.Invoke(args);
#else
            o = constructor.Invoke(args);
#endif
            BuildUp(o, ResolveOptions.Default);

            return o;
        }
        catch (Exception ex)
        {
            throw new TinyIoCResolutionException(typeToConstruct, ex);
        }

它会起作用,但我们会遇到另一个问题。主要问题是BuildUp将尝试填充它将找到的所有空引用。并且没有合适的ResolveOptions来避免这种情况:(我是对的吗?

...

最后我创建了Inject属性。您可以使用[Inject]标记任何引用类型属性,您将获得所需的行为。

此处提供了来源:https://github.com/AIexandr/Nancy/blob/master/src/Nancy/TinyIoc/TinyIoC.cs 所有更改都向后兼容。

答案 1 :(得分:0)

是的,TinyIoC supports property injection。这也适用于南希。