私は .Net Web Forms プロジェクト構造を開発しており、Unity をアプリケーションの DI フレームワークとして使用することにしました。
MSDN-Resolving in Asp.Netでは、プロジェクトに依存関係を挿入するには、DI コンテナーの外部で作成された初期オブジェクトを構築する必要があると述べています。そうは言っても、私たちは質問に行きます。
などの属性アノテーション
[Dependency]
は、クラスを拡張するAttribute
クラスです。それらを使用するには、宣言するクラスに別の名前空間を含める必要があります。これにより、クラスがクラスに依存するようになりますMicrosoft.Practices.Unity.DependencyAttribute
。では、クラスが使用する IMyInterface の実装を認識していなくても、Dependency クラスの具体的な実装を認識している必要があるのでしょうか? ここで私が見逃しているのは何ですか?DI フレームワークを変更する場合、プロジェクト全体ですべての注釈を削除する必要があります。この種の宣言 (構成ファイルなど) をコンテナーの外で回避する方法はありますか?
編集 --> ここにコード
/*This is the abstract base class where I want the dependency injection to occur*/
public abstract class BasePage : System.Web.UI.Page
{
private IMyService _dtService;
public IMyService DtService
{
get { return _dtService; }
set { _dtService = value; }
}
}
Default.aspx コード ビハインド
public partial class _Default : BasePage
{
public _Default( )
{
}
protected void Page_Load(object sender, EventArgs e)
{
try
{
DataClass dt = DtService.GetDataById(2);
lblWhatever.Text = dt.Description;
}
}
}
グローバル コード ビハインド
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
IUnityContainer myContainer = HttpContext.Current.Application.GetDIContainer();
myContainer.RegisterType<IMyService,MyServiceClient>(new
InjectionConstructor("MyServiceWsEndpoint"));
// I have tried this with BasePage too
myContainer.RegisterType<_Default>(new InjectionProperty("DtService"));
}
}
そして、モジュール
public class UnityHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
}
public void Dispose() { }
private void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
IHttpHandler currentHandler = HttpContext.Current.Handler;
/*This does not work*/
HttpApplicationStateExtensions.GetDIContainer(HttpContext.Current.Application).BuildUp(
currentHandler.GetType(), currentHandler);
/* While this works*/
HttpApplicationStateExtensions.GetDIContainer(HttpContext.Current.Application).BuildUp<_Default>((_Default)currentHandler);
var currentPage = HttpContext.Current.Handler as Page;
if (currentPage != null)
{
currentPage.InitComplete += OnPageInitComplete;
}
}
}
モジュール内のコードは毎回到達します。[Dependency]
属性を使用すると、行は INDEED で機能します。