Подтвердить что ты не робот

Как правильно зарегистрировать AutoFac на базовом веб-сайте MVC5.1?

AutoFac недавно был обновлен для MVC 5.1, но на момент написания я обнаружил, что документации нет (особенно для простого примера).

Я хотел бы добавить зависимости в MVC-контроллеры и зарегистрировать мои собственные реализации, например. e-mail (фактическая отправка и печать в окно вывода) в качестве базового примера.

Я не знаю, не хватает ли я для этого хорошего ресурса, и я слегка обеспокоен тем, что, поскольку он использует спецификацию OWIN, реализация может отличаться для MVC5.1 (ASP.NET Identity использует OWIN, и есть некоторые специальные атрибуты, используемые для правильного создания OWIN), поэтому вам нужно проверить, что я прав.

У меня есть рабочий пример с приведенным ниже установочным кодом - это правильная и правильная практика для стандартного веб-приложения MVC5.1?

Бонусный вопрос: мне нужно добавить экземпляр InstancePerHttpRequest в строку RegisterControllers? то есть builder.RegisterControllers(typeof (MvcApplication).Сборка).InstancePerHttpRequest();

(Примечание. Я вижу примеры в GitHub от Autofac, но не могу найти простой пример, соответствующий MVC5.1.)

public static void RegisterDependencies()
{
    // Register MVC-related dependencies
    var builder = new ContainerBuilder();
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
    builder.RegisterModule<AutofacWebTypesModule>();

    // Register e-mail service
    builder.RegisterType<EmailSenderToDebug>().As<IEmailSender>().InstancePerHttpRequest();

    builder.RegisterModelBinderProvider();

    // Set the MVC dependency resolver to use Autofac
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

И мой контроллер:

public class HomeController : Controller
{

    public IEmailSender _email { get; set; }

    public  HomeController(IEmailSender es)
    {
        this._email = es;
    }
    //
    // GET: /Home/
    public ActionResult Index()
    {

        Email e = new Email();
        e.To(new MailAddress("[email protected]", "mr. something"));
        e.Subject("test");
        e.Message("hello world");
        e.From(new MailAddress("[email protected]", "mr. else"));
        this._email.SendEmail(e);
        return View();
    }
}

Спасибо!

4b9b3361

Ответ 1

Здесь у меня есть - обратная связь приветствуется!

Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // Register Inversion of Control dependencies
        IoCConfig.RegisterDependencies();

        // Typical MVC setup
        // ....
    }
}

Папка App_Start:

public class IoCConfig
{

    /// <summary>
    /// For more info see 
    /// :https://code.google.com/p/autofac/wiki/MvcIntegration (mvc4 instructions)
    /// </summary>
    public static void RegisterDependencies()
    {
        #region Create the builder
        var builder = new ContainerBuilder();
        #endregion

        #region Setup a common pattern
        // placed here before RegisterControllers as last one wins
        builder.RegisterAssemblyTypes()
               .Where(t => t.Name.EndsWith("Repository"))
               .AsImplementedInterfaces()
               .InstancePerHttpRequest();
        builder.RegisterAssemblyTypes()
               .Where(t => t.Name.EndsWith("Service"))
               .AsImplementedInterfaces()
               .InstancePerHttpRequest();
        #endregion

        #region Register all controllers for the assembly
        // Note that ASP.NET MVC requests controllers by their concrete types, 
        // so registering them As<IController>() is incorrect. 
        // Also, if you register controllers manually and choose to specify 
        // lifetimes, you must register them as InstancePerDependency() or 
        // InstancePerHttpRequest() - ASP.NET MVC will throw an exception if 
        // you try to reuse a controller instance for multiple requests. 
        builder.RegisterControllers(typeof(MvcApplication).Assembly)
               .InstancePerHttpRequest();

        #endregion

        #region Register modules
        builder.RegisterAssemblyModules(typeof(MvcApplication).Assembly);
        #endregion

        #region Model binder providers - excluded - not sure if need
        //builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
        //builder.RegisterModelBinderProvider();
        #endregion

        #region Inject HTTP Abstractions
        /*
         The MVC Integration includes an Autofac module that will add HTTP request 
         lifetime scoped registrations for the HTTP abstraction classes. The 
         following abstract classes are included: 
        -- HttpContextBase 
        -- HttpRequestBase 
        -- HttpResponseBase 
        -- HttpServerUtilityBase 
        -- HttpSessionStateBase 
        -- HttpApplicationStateBase 
        -- HttpBrowserCapabilitiesBase 
        -- HttpCachePolicyBase 
        -- VirtualPathProvider 

        To use these abstractions add the AutofacWebTypesModule to the container 
        using the standard RegisterModule method. 
        */
        builder.RegisterModule<AutofacWebTypesModule>();

        #endregion

        #region Set the MVC dependency resolver to use Autofac
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        #endregion

    }

 }

Затем вы можете регистрировать модули по своему усмотрению, что действительно здорово, если у вас есть модульное приложение, и вы не знаете, что собираетесь включить в свой проект. Вы можете настроить проект и не требовать ручного вмешательства (я хочу!)....

public class RegisterApplicationIoC : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<EmailSenderToDebug>()
               .As<IEmailSender>()
               .InstancePerHttpRequest();
    }
}