No instance is registered by default and cannot be automatically determined for type

The definition of my interface is as follows:

public interface IApplicationSettings
{
   string LoggerName { get; }
   string NumberOfResultsPerPage { get; }
   string EmailAddress { get; }
   string Credential { get; }
}

The implementation of this interface is given below:

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"]; }
        }
    }

I also created a factory class to get an instance of a specific implementation of WebConfigSettings as follows:

public class ApplicationSettingsFactory
    {
        private static IApplicationSettings _applicationSettings;

        public static void InitializeApplicationSettingsFactory(
                                      IApplicationSettings applicationSettings)
        {
            _applicationSettings = applicationSettings;
        }

        public static IApplicationSettings GetApplicationSettings()
        {
            return _applicationSettings;
        }
    }

Then I resolved the dependency as follows:

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>());

        }
    }

Now, when I run my application, it throws me the following exception:

Exception has been thrown by the target of an invocation.

and the internal exception is

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

I am using StructureMap for MVC5

+4
source share
3 answers

. . .

ObjectFactory.Initialize(x =>
            {
                x.AddRegistry<ControllerRegistry>();

            }); 

IContainer Initialize() {
            return new Container(c => c.AddRegistry<ControllerRegistry>());
        }

ControllerRegistry :

// Application Settings                 
For<IApplicationSettings>().Use<WebConfigApplicationSettings>();

Global.asax :

Bootstrap.ConfigureDependencies();

, Global.asax Factory :

 ApplicationSettingsFactory.InitializeApplicationSettingsFactory
                                  (ObjectFactory.GetInstance<IApplicationSettings>());

:

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>();

           }
        }

    }

Global.asax

Bootstrap.ConfigureDependencies();

ApplicationSettingsFactory.InitializeApplicationSettingsFactory
                                  (ObjectFactory.GetInstance<IApplicationSettings>());
+2

, , , ObjectFactory.GetInstance<IApplicationSettings>() , , StructureMap .

, ( ):

public class ApplicationSettingsFactory
{
    public ApplicationSettingsFactory(WebConfigApplicationSettings applicationSettings)
    {
        _applicationSettings = applicationSettings;
    }

    private static IApplicationSettings _applicationSettings;

    public IApplicationSettings GetApplicationSettings()
    {
        return _applicationSettings;
    }
}

:

public DefaultRegistry() {

    Scan(scan => {
         scan.TheCallingAssembly();
         scan.WithDefaultConventions();
         scan.With(new ControllerConvention());
    });

    this.For<IApplicationSettings>().Use(ctx => ctx.GetInstance<ApplicationSettingsFactory>().GetApplicationSettings());

}
+4

, StructureMap, , .

:

  • " " (ISP).

    ISP , ( ) , . , IApplicationSettings, , . , , . , API , .

  • / (OCP).

    OCP , . , IApplicationSettings ( , , /) .

  • , .

    IApplicationSettings, ConfigurationManager.AppSettings. , , . , , , .

:

  • .
  • , .

, .

, , . , , .

, - ApplicationSettings DTO. DTO - , . :

public static Container Bootstrap() {
    return Bootstrap(new ApplicationSettings
    {
        LoggerName = ConfigurationManager.AppSettings["LoggerName"],
        NumberOfResultsPerPage = int.Parse(
            ConfigurationManager.AppSettings["NumberOfResultsPerPage"]),
        EmailAddress = new MailAddres(
            ConfigurationManager.AppSettings["EmailAddress"]),
        Credential = ConfigurationManager.AppSettings["Credential"],
    });
}

public static Container Bootstrap(ApplicationSettings settings) {
    var container = new Container();

    container.RegisterSingle<ILogger>(
        new SmtpLogger(settings.LoggerName, settings.EmailAddress));

    container.RegisterSingle<IPagingProvider>(
        new PagingProvider(settings.NumberOfResultsPerPage));

    // Etc

    return container;
}

, ApplicationSettings DTO . , DI , .

, , .

, , DI, , . , , .

, , ; . IConnectionStringSettings, , . , ! IConnectionFactory IDbContextFactory, SqlConnection DbContext. , connectionFactory.CreateConnection() , .

, .

+3

All Articles