0

I'm having problem with injecting my service. I've a ISettingService. I'm testing registration onmy application and using email confirmation.

So, at the EmailMessageService class which is inherit from IIdentityMessageService

I'm using Unity for Ioc. I'd registered ISettingService at unity config like below

.RegisterType<ISettingService, SettingService>()

I need to inject this interface to EmailMessageService class to access settings.

Here is the EmailMessageService class

public class EmailMessagingService : IIdentityMessageService
{
    private ISettingService SettingService { get; set; }

    public Task SendAsync(IdentityMessage message)
    {
        var fromEmailAddress = ConfigurationManager
            .AppSettings["IdentityFromEmailAddress"];

        var text = message.Body;
        var html = message.Body;

        // Do whatever you want to the message
        using (var msg = new MailMessage())
        {
            msg.From = new MailAddress(fromEmailAddress);
            msg.To.Add(new MailAddress(message.Destination));
            msg.Subject = message.Subject;

            msg.AlternateViews.Add(
                AlternateView.CreateAlternateViewFromString(
                    text, null, MediaTypeNames.Text.Plain)
                );

            msg.AlternateViews.Add(
                AlternateView.CreateAlternateViewFromString(
                    html, null, MediaTypeNames.Text.Html)
                );


            // var smtpClient = new SmtpClient("smtp.whatever.net", Convert.ToInt32(587));
            // var credentials = new System.Net.NetworkCredential(Keys.EmailUser, Keys.EMailKey);
            // smtpClient.Credentials = credentials;

            using (var smtpClient = new SmtpClient())
            {
                var setting = SettingService.Query().Select().FirstOrDefault();

                if (setting != null)
                {
                    if (!string.IsNullOrEmpty(setting.SmtpHost))
                    {
                        smtpClient.Host = setting.SmtpHost;
                        smtpClient.Port = Convert.ToInt32(setting.SmtpPort);

                        if (setting.IsSmtpSsl)
                        {
                            smtpClient.EnableSsl = true;
                        }
                    }
                }

                smtpClient.Send(msg);
            }
        }
        return Task.FromResult(0);
    }
}

EmailMessageService class instantiating at Startup.Auth

            var manager =
            new ApplicationUserManager(
                new ApplicationUserStore(context.Get<DataContext>()));
            ...
            manager.EmailService = new EmailMessagingService();

I cant use Constructor injecting be cause of this direct call. So i used setter injection. But im getting error like "Object reference not set to an instance of an object"

var setting = SettingService.Query().Select().FirstOrDefault();

in EmailMessageService.

  • 1
    `SettingService` is `private`, which means that from the perspective of any reasonably composition engine, that property doesn't exist. Apart from that, it's not clear to me why you can't use Constructor Injection. – Mark Seemann Nov 21 '15 at 14:42
  • I made it Public but im getting same error. if i use constructor inject `manager.EmailService = new EmailMessagingService();` i need to give parameter to this line. And i dont really know how to do that. – Taşyürek Gökşah Nov 21 '15 at 15:45
  • Do we have to new up the SmtpClient or is it recommended to inject it via DI? – variable Jan 13 '22 at 12:41

1 Answers1

0

O.K What exacly happend i dont know but by changing UnityMvcActivator Start method like below its fixed.

public static void Start()
    {
        var container = ContainerManager.GetConfiguredContainer();
        UnityConfig.RegisterTypes(container);

        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        try
        {
            //http://stackoverflow.com/questions/699852/how-to-find-all-the-classes-which-implement-a-given-interface
            foreach (var assembly in assemblies)
            {
                var instances = from t in assembly.GetTypes()
                                where t.GetInterfaces().Contains(typeof(IDependencyRegister))
                                         && t.GetConstructor(Type.EmptyTypes) != null
                                select Activator.CreateInstance(t) as IDependencyRegister;

                foreach (var instance in instances.OrderBy(x => x.Order))
                {
                    instance.Register(container);
                }
            }
        }
        catch (ReflectionTypeLoadException ex)
        {
        http://stackoverflow.com/questions/1091853/error-message-unable-to-load-one-or-more-of-the-requested-types-retrieve-the-l
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (Exception exSub in ex.LoaderExceptions)
            {
                sb.AppendLine(exSub.Message);
                System.IO.FileNotFoundException exFileNotFound = exSub as System.IO.FileNotFoundException;
                if (exFileNotFound != null)
                {
                    if (!string.IsNullOrEmpty(exFileNotFound.FusionLog))
                    {
                        sb.AppendLine("Fusion Log:");
                        sb.AppendLine(exFileNotFound.FusionLog);
                    }
                }
                sb.AppendLine();
            }
            string errorMessage = sb.ToString();

            throw new Exception(errorMessage, ex);
            //Display or log the error based on your application.
        }


        // TODO: Uncomment if you want to use PerRequestLifetimeManager
        // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
    }