Bir .Net Web Formları proje yapısı geliştiriyorum ve uygulama için bir DI framework olarak Unity kullanmaya karar verdim. Unity [Depedency] Notu bir bağımlılığın kendisi mi?
Projemdeki bağımlılıkları enjekte etmek amacıyla ben DI konteyner ait dışında oluşturulan ilk nesne kurmak gerektiğini belirtmektedir. Bu soruya geldiğimiz söyleniyor. örneğin[Dependency]
olarak
özelliği ek açıklamaları
Attribute
sınıf uzanan sınıflardır. Bunları kullanmak için, bildiren sınıfa başka bir ad alanı eklenmeli ve böylece sınıfımızınMicrosoft.Practices.Unity.DependencyAttribute
sınıfına bağımlı olması gerekir. Şimdi, sınıfımızın kullandığı IMyInterface'in uygulanmasının farkında olmasa da, Bağımlılık sınıfının somut uygulamasının farkında olmalı mı? Buradaki eksikliğim nedir? DI çerçevesini değiştireceksek, proje boyunca tüm ek açıklamaları kaldırmamız gerekirdi.Kabın dışında bu tür bildirimlerin (yapılandırma dosyaları veya neyin olmaması) önlenmesi için bir yol var mı?
DÜZENLEME -> Kod burada
/*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; }
}
}
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"));
}
}
Ve modül
arkasındapublic partial class _Default : BasePage
{
public _Default()
{
}
protected void Page_Load(object sender, EventArgs e)
{
try
{
DataClass dt = DtService.GetDataById(2);
lblWhatever.Text = dt.Description;
}
}
}
Küresel kod arkasında default.aspx kodu
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;
}
}
}
Modül içindeki kod her seferinde ulaşılır. [Dependency]
Özniteliği kullandığımda satır INDEED çalışır.
En IOC konteynerler size kısıtlaması bu tür yerleştirmeyin. Bir soruna neden olursa, alternatif bir kapsayıcıyı düşünebilirsiniz - örn. structuremap, autofac, simpleinjector vb. – MattDavey
Unity Framework'ün bir kısıtı değil, daha çok asp'in bir kısıtı.Nesnelerin Yapısını kontrol edemediğim Net WebForms, bu yüzden Emlak enjeksiyonuna ihtiyacım var. Diğer DI çerçeveleri, söz konusu enjeksiyonu gerektiren sınıfı değiştirmeden Mülkiyet enjeksiyonu yapabilir mi? –
Doğru - bu sorunun ilk cevabı (http://stackoverflow.com/questions/4979453/structuremap-beginner-property-injection) tam olarak bu senaryoyu açıklar (Structuremap kullanarak). DI kütüphanelerinin çoğunun bu davranışı içerdiğini varsayalım. – MattDavey