没有注册默认实例,无法自动确定类型

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

Jos*_*ard 6

您的代码无法正常工作的原因是,当您调用时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)


Moj*_*que 4

感谢大家的回复。我找到了我的解决方案。解决方案是我创建了另一个类来解决依赖关系,而不是使用默认注册表。我在课堂上使用的

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)