我正在尝试Ninject,我正在修改我用Structure Map编写的代码,看看它有多容易.在这个基本代码中,我有一个通过Structure Map注册表具有不同配置的对象图,并且在运行时通过数据库中的值选择要使用的对象(在这种情况下,为了拉回注入了一些对象的wcf服务主体) .例如(使用结构图代码):
注册表1设置IBusinessContext,IRules和ILogger类型的所有默认值.这只是在接口旁边添加类型GenericContext/Logger/Rules而没有其他专门化.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
Run Code Online (Sandbox Code Playgroud)
Registry 2设置IBusinessContext以使用SpecialisedContext类并告诉ctor使用SpecializedLogger.IBusinessContext的实例名为"SpecializedContext".
public SpecializedRegistry()
{
// Old style syntax as it affects the default for IBusinessContext
// Perhaps a hint at what I'm doing?
InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
}
Run Code Online (Sandbox Code Playgroud)
这一切都在结构图中按预期工作(取决于旧的或新的语法).
但是,当我一直在使用Ninject时我遇到了一个问题,期望未命名的实例是默认的(不是Ninject如何工作,我得到了).这导致了一些研究,这些研究都表明使用命名实例是一个非常糟糕的想法.我知道有更好的方法可以使用自动注册或属性来设置名称或请求某种类型,但在我所描述的系统中,需要在运行时有一种方法来确定要求的配置在树的顶部(让IoC框架根据已注册的类型或规则计算出其余部分).
所以...我只是在这里使用IoC概念错误,希望通过名称来询问我的顶级对象,或者通常有更好的方法来做我正在尝试做的事情?我应该使用像MEF这样的东西来处理这些插件吗?
我强调我不是像愚蠢的工厂那样使用它,并且在每个级别的代码中询问容器中x类型的实例,它只是启动操作.
在此先感谢您的时间和帮助:)