Код исключения StructureMap: 202 - PullRequest
0 голосов
/ 24 декабря 2011

каждый, у меня проблемы при использовании кода MVC3 выглядит следующим образом

 public SystemController(IRepository repository)
            :this
        (
            repository,
            new AspNetMembershipProviderWrapper(System.Web.Security.Membership.Provider),
                new AspNetMembershipProviderWrapper(System.Web.Security.Membership.Provider),
                new AspNetRoleProviderWrapper(Roles.Provider),
            new SmtpClientProxy(new SmtpClient(Utils.Setting.EmailServer,
                                               int.Parse(Utils.Setting.EmailPort))
                                    {
                                        EnableSsl = true,
                                        UseDefaultCredentials = true,
                                        Credentials = new NetworkCredential(Utils.Setting.EmailAccount,
                                                                            Utils.Setting.EmailPassword),
                                        DeliveryMethod = SmtpDeliveryMethod.Network
                                    })
       ){}



        public SystemController(IRepository repository,
            IUserService userService,
            IPasswordService passwordService,
            IRolesService rolesService,
            ISmtpClient smtpClient)
            : base(repository)
        {
            _userService = userService;
            _passwordService = passwordService;
            _rolesService = rolesService;
            _smtpClient = smtpClient;
        }

public class SmtpClientProxy : ISmtpClient
    {
        private readonly SmtpClient _smtpClient;

        public SmtpClientProxy(SmtpClient smtpClient)
        {
            _smtpClient = smtpClient;
        }

        #region ISmtpClient Members

        public void Send(MailMessage mailMessage)
        {
            _smtpClient.Send(mailMessage);
        }

        #endregion
    }

 ObjectFactory.Initialize(x =>
                                 {
                                     x.Scan(scanner =>
                                                {
                                                    scanner.TheCallingAssembly();
                                                    scanner.WithDefaultConventions();
                                                });
                                     x.For<ISessionFactory>()
                                         .Singleton()
                                         .Use(GetSessionFactory());
                                     x.For<ISession>()
                                         .HybridHttpOrThreadLocalScoped()
                                         .Use(y => y.GetInstance<ISessionFactory>().OpenSession());
                                     x.For<IUserService>()
                                         .Use<AspNetMembershipProviderWrapper>();
                                     x.For<IPasswordService>()
                                         .Use<AspNetMembershipProviderWrapper>();
                                     x.For<IPasswordService>()
                                         .Use<AspNetMembershipProviderWrapper>();
                                     x.For<IRolesService>()
                                         .Use<AspNetRoleProviderWrapper>();
                                     x.For<ISmtpClient>()
                                         .Use<SmtpClientProxy>().Ctor<SmtpClient>();
                                     x.For<MembershipProvider>()
                                         .Use(System.Web.Security.Membership.Provider);
                                     x.For<RoleProvider>()
                                       .Use(Roles.Provider);
                                 });

Информация об ошибке:

Код исключения StructureMap: 202 Не определен экземпляр по умолчанию для PluginFamily System.Net.Mail.SmtpClient, Система, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089


Я думаю, что проблема заключается в следующем:

x.For <ISmtpClient> ()
. Use <SmtpClientProxy> (). Ctor <SmtpClient> ();

Я спрашиваю, как это написать?

1 Ответ

2 голосов
/ 24 декабря 2011

Вашему классу SmtpClientProxy требуется класс SmtpClient в своем конструкторе. У вас ничего не зарегистрировано для SmtpClient.

Попробуйте добавить это к вашей регистрации:

x.For<SmtpClient>().Use<SmtpClient>(); 

Предполагается, что SmtpClient не принимает зависимости в его конструкторе . Если это произойдет, вы, вероятно, получите ошибку, что одна из его зависимостей не зарегистрирована в реализации по умолчанию.

В качестве альтернативы вы можете изменить код конструктора следующим образом (без зависимости от конструктора):

private readonly SmtpClient _smtpClient = new SmtpClient();  

public SmtpClientProxy()  
{  
}  

Не зная, что вы пытаетесь сделать, трудно ответить однозначно.

...