是的我知道,最好使用构造函数注入,我大部分时间都使用它,但是,有一个场景,我喜欢使用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注入这些依赖项?
答案 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。这也适用于南希。