Moj*_*que 5 structuremap asp.net-mvc ioc-container
我的界面定义如下:
public interface IApplicationSettings
{
string LoggerName { get; }
string NumberOfResultsPerPage { get; }
string EmailAddress { get; }
string Credential { get; }
}
Run Code Online (Sandbox Code Playgroud)
该接口的实现如下:
public class WebConfigApplicationSettings : IApplicationSettings
{
public string LoggerName
{
get { return ConfigurationManager.AppSettings["LoggerName"]; }
}
public string NumberOfResultsPerPage
{
get { return ConfigurationManager.AppSettings["NumberOfResultsPerPage"]; }
}
public string EmailAddress
{
get { return ConfigurationManager.AppSettings["EmailAddress"]; }
}
public string Credential
{
get { return ConfigurationManager.AppSettings["Credential"]; }
}
}
Run Code Online (Sandbox Code Playgroud)
我还创建了一个工厂类来获取WebConfigSettings具体实现的实例,如下所示:
public class ApplicationSettingsFactory
{
private static IApplicationSettings _applicationSettings;
public static void InitializeApplicationSettingsFactory(
IApplicationSettings applicationSettings)
{
_applicationSettings = applicationSettings;
}
public static IApplicationSettings GetApplicationSettings()
{
return _applicationSettings;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我解决了依赖关系如下:
public class DefaultRegistry : Registry {
public DefaultRegistry() {
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<IApplicationSettings>().Use<WebConfigApplicationSettings>();
ApplicationSettingsFactory.InitializeApplicationSettingsFactory
(ObjectFactory.GetInstance<IApplicationSettings>());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行我的应用程序时,它会抛出以下异常:
Exception has been thrown by the target of an invocation.
Run Code Online (Sandbox Code Playgroud)
而内在的例外是
No default Instance is registered and cannot be automatically determined for type 'Shoppingcart.Infrastructure.Configuration.IApplicationSettings'\r\n\r\nThere is no configuration specified for Shoppingcart.Infrastructure.Configuration.IApplicationSettings\r\n\r\n1.) Container.GetInstance(Shoppingcart.Infrastructure.Configuration.IApplicationSettings)\r\n
Run Code Online (Sandbox Code Playgroud)
我正在使用StructureMap for MVC5
您的代码无法正常工作的原因是,当您调用时ObjectFactory.GetInstance<IApplicationSettings>(),您的注册表尚未注册,因此,StructureMap的配置不完整.
我相信你要做的是以下(测试和工作):
public class ApplicationSettingsFactory
{
public ApplicationSettingsFactory(WebConfigApplicationSettings applicationSettings)
{
_applicationSettings = applicationSettings;
}
private static IApplicationSettings _applicationSettings;
public IApplicationSettings GetApplicationSettings()
{
return _applicationSettings;
}
}
Run Code Online (Sandbox Code Playgroud)
您的注册表配置如下:
public DefaultRegistry() {
Scan(scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
this.For<IApplicationSettings>().Use(ctx => ctx.GetInstance<ApplicationSettingsFactory>().GetApplicationSettings());
}
Run Code Online (Sandbox Code Playgroud)
感谢大家的回复。我找到了我的解决方案。解决方案是我创建了另一个类来解决依赖关系,而不是使用默认注册表。我在课堂上使用的
ObjectFactory.Initialize(x =>
{
x.AddRegistry<ControllerRegistry>();
});
Run Code Online (Sandbox Code Playgroud)
代替
IContainer Initialize() {
return new Container(c => c.AddRegistry<ControllerRegistry>());
}
Run Code Online (Sandbox Code Playgroud)
然后在 ControllerRegistry 中我解决了依赖关系,如下所示:
// Application Settings
For<IApplicationSettings>().Use<WebConfigApplicationSettings>();
Run Code Online (Sandbox Code Playgroud)
然后我在Global.asax中调用该类,如下所示:
Bootstrap.ConfigureDependencies();
Run Code Online (Sandbox Code Playgroud)
最后在Global.asax中,我解决了 Factory 类的依赖关系,如下所示:
ApplicationSettingsFactory.InitializeApplicationSettingsFactory
(ObjectFactory.GetInstance<IApplicationSettings>());
Run Code Online (Sandbox Code Playgroud)
我的整个代码如下:
Bootstrap类(新创建的)
public class Bootstrap
{
public static void ConfigureDependencies()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<ControllerRegistry>();
});
}
public class ControllerRegistry : Registry
{
public ControllerRegistry()
{
// Application Settings
For<IApplicationSettings>().Use<WebConfigApplicationSettings>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
全局.asax
Bootstrap.ConfigureDependencies();
ApplicationSettingsFactory.InitializeApplicationSettingsFactory
(ObjectFactory.GetInstance<IApplicationSettings>());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21395 次 |
| 最近记录: |