まず、これを実行できることは知っていますが、セットアップや実装に関与していないため、どのように実行されるかわかりませんでした。
以前の仕事で、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 から注入する必要があるプロパティを持つことを意図しています。