web-dev-qa-db-ja.com

AutoFacを基本的なMVC5.1 Webサイトに正しく登録するにはどうすればよいですか?

AutoFacは最近MVC 5.1用に更新されましたが、執筆時点でドキュメントが不足していることがわかりました(特に簡単な例)。

MVC Controllersに依存関係を注入し、たとえば、基本的な例としての電子メール(実際の送信と出力ウィンドウへの印刷)。

このための良いリソースが不足しているかどうかはわかりませんが、MVC5.1の実装が異なる可能性があるOWIN仕様を使用しているため、ASP.NET IdentityはOWINを使用し、いくつかの特別な属性が使用されていることを少し心配していますOWINを適切にインスタンス化するには).

以下のセットアップコードを使用した実例があります-これは標準のMVC5.1 Webアプリの正しいプラクティスですか?

ボーナス質問:RegisterControllers行にInstancePerHttpRequestを追加する必要がありますか?すなわち、builder.RegisterControllers(typeof(MvcApplication).Assembly).InstancePerHttpRequest();

(注:AutofacのGitHubの例はありますが、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();
    }
}

ありがとう!

27
DanAbdn

ここに私が持っているものがあります-フィードバック歓迎!

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();
    }
}
39
DanAbdn