0

まず、これを実行できることは知っていますが、セットアップや実装に関与していないため、どのように実行されるかわかりませんでした。

以前の仕事で、Web アプリケーション (MVC または Web アプリケーション) のサポートを手伝っていたとき、いつもの EF デザイン パターンがありました。しかし、EF オブジェクトを使用するときは、ページ/コントローラーでプロパティを宣言するだけで、リポジトリ/サービスにアクセスできました。

宣言後に明示性を宣言する限り、何もする必要はありませんでしたvar prop1 = IOC.Resolve<Type>;。自動入力されます。これは依存性注入だと思いましたが、これを可能にする方法についての記事は見たことがありません。

どんな助けでも素晴らしいでしょう。

編集 2014-04-13

このような Global.asax ファイル内でプロパティ インジェクションを実行しようとしました。

protected void Application_Start( object sender , EventArgs e ) {
    App.Initialize( null );

    if( HttpContext.Current != null ) {
        var pg = base.Context.Handler as Page;
        if( pg != null ) {
            App.InjectProperties( pg );
        }
    }
}

私はif....ロジックを実行しようとしApplication_BeginRequestましたが、どちらも成功しませんでした。

App.cs

public class App {
    public static void Initialize( string log4netPath ) {
        var container = new WindsorContainer();

        container.Kernel.ComponentModelCreated += ( s => {
            if( s.LifestyleType == LifestyleType.Undefined ) {
                s.LifestyleType = LifestyleType.PerWebRequest;
            }
        } );

        container.Install(
            new DomainInstaller() ,
            new RepositoryInstaller() ,
            new ServiceInstaller()
            );

        container.Install( new SiteInstaller() );

        if( log4netPath != null || string.IsNullOrWhiteSpace( log4netPath ) )
            container.AddFacility( new LoggingFacility( LoggerImplementation.Log4net , log4netPath ) );

        CWC.Init( container );
    }

    public static void InjectProperties( Page pg ) {
        var type = pg.GetType();
        foreach( var prop in type.GetProperties() ) {
            if( CWC.IsInitialized ) {
                try {
                    var obj = CWC.Resolve(prop.PropertyType);
                    prop.SetValue( pg , obj , null );
                } catch( System.Exception ) {
                    //do nothing
                }
            }
        }

    }
}

DomainInstaller.cs (ほぼすべてのインストーラー クラスがこの方法でセットアップされます):

public class DomainInstaller : IWindsorInstaller {
    #region IWindsorInstaller Members

    public void Install( Castle.Windsor.IWindsorContainer container , Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store ) {
        container.Register( Types.FromAssembly( Assembly.GetExecutingAssembly() )
            .Where( t => t.Namespace.StartsWith( "Woodsoft.Domain" ) )
                .WithService.FirstInterface().LifestylePerWebRequest() 
        );
    }

    #endregion
}

だから私は自分の問題を見つけたかもしれないと思いますが、ページとマスターページの両方にEFデータフレームワークから注入する必要があるプロパティが含まれているため、ソリューションを実装する方法がわかりません。以下は MVC 実装の例ですが、Page オブジェクトと MasterPage オブジェクトには、コントローラーのように使用できる直接共通の派生インターフェイスがありません。

別のプロジェクト、MVC パターン:

public class SiteInstaller : IWindsorInstaller {
    #region IWindsorInstaller Members

    public void Install( IWindsorContainer container , IConfigurationStore store ) {
        container.Register(
            Classes.FromThisAssembly()
                .BasedOn<IController>()
                    .LifestyleTransient()
        );
    }

    #endregion
}

このインストーラーを MVC から WebForms に変更する方法はありますか? MasterPage と Page の両方が、Windsor Container から注入する必要があるプロパティを持つことを意図しています。

4

1 に答える 1

0
  • 通常、MVC では、エントリ ポイントはビューをレンダリングするコントローラー アクションです。
  • デフォルトでは、MVC フレームワークはコントローラー クラスをインスタンス化し、適切なアクション (コントローラー メソッド) を呼び出します。
  • コントローラーがインスタンス化されると、MVC は、コントローラーがインスタンス化するために必要なすべてのものを提供するために、全力を尽くします。例えば

このMVCコントローラーを検討してください

public class MyController : Controller
{
 public MyController()
 {
  // mvc can easily instantiate this controller 
  // since this is a parameter less controller.
 }
}

これを考慮してください:

public class MyController : Controller
{
 public MyController(IRepository repository)
 {
  // mvc cannot easily instantiate this controller 
  // unless it knows how to inject a concrete implementation
  // of the IRepository interface
 }
}

通常、インフラストラクチャのセットアップの一環としてチームが行うことは、MVC フレームワークに依存関係リゾルバーを提供することです。

例えば

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

ここで、MVC がコントローラーをインスタンス化する必要がある場合、具体的な IRepository が必要であり、ユーザー提供の DI フレームワークに責任を委任できることがわかります。この場合、Autofac.

Autofac に IRepository タイプを提供するように要求します。

Application Start で通常行うことは、

ContainerBuilder builder = new ContainerBuilder();

// critical line
builder.Register(c => new EFRepository()).As<IRepository>();

IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

ご覧のとおり、コントローラーがインスタンス化されると、魔法のように (魔法のようではありませんが、いくつかの基礎作業を行いました) IRepository タイプを取得し、アクション メソッドで次のことができます。

var results = this.repository.GetEmployees();

IRepository がコンストラクターを介して注入される方法と同様に、コントローラーのプロパティを介して注入することもできます。

builder.Register(c => new MyType()).As<IType>().PropertiesAutowired();

あなたのページのために、あなたもできる

builder.RegisterType<YourPageType>().PropertiesAutowired();

DI (ここでは Autofac) は、ページ プロパティに登録済みの具象型を自動的に入力します。

于 2014-04-13T00:52:23.873 に答える