我試圖按照簡單注入器網站上的How To部分中的建議按鍵解析實例。爲什麼Simple Injector不會處理由Func解決的實例?
我使用基於字典的工廠。該字典將包含對DI容器的引用。當創建實例時,將會詢問DI容器。在原始代碼中,工廠是使用new()運算符創建的。我改變了這個讓DI容器自動處理工廠。 (現在請讓我,如果存在另一種方式來實現這一目標。)
var diContainer = new Container();
//diContainer.RegisterSingleton<IBasicFactory>(new BasicFactory
//{
// { "A",() => diContainer.GetInstance<A>() },
// { "B",() => diContainer.GetInstance<B>() },
//});
diContainer.RegisterSingleton<IBasicFactory, BasicFactory>();
var instance = (BasicFactory) diContainer.GetInstance<IBasicFactory>();
instance.Add("A",() => diContainer.GetInstance<A>());
instance.Add("B",() => diContainer.GetInstance<B>());
diContainer.Verify();
var factory = diContainer.GetInstance<IBasicFactory>();
factory.CreateInstance("A").SayHello();
factory.CreateInstance("B").SayHello();
diContainer.Dispose();
的情況下創建工作得很好,但那些由工廠(A和B)返回的非將佈置在DI contanier是處置。
我在做什麼錯了?
這裏遵循的其他代碼:
using System;
using System.Collections.Generic;
public interface IBasic
{
void SayHello();
}
public abstract class Basic : IBasic, IDisposable
{
protected Basic()
{
System.Console.WriteLine("Creating instance of Basic");
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(disposing)
System.Console.WriteLine("Disposing instance of Basic");
}
public abstract void SayHello();
}
public interface IBasicFactory
{
IBasic CreateInstance(string key);
}
public class BasicFactory : Dictionary<string, Func<IBasic>>, IBasicFactory, IDisposable
{
public BasicFactory()
{
System.Console.WriteLine("Creating instance of BasicFactory");
}
public IBasic CreateInstance(string key)
{
Func<IBasic> createObject;
if (this.TryGetValue(key, out createObject))
return createObject();
var msg = $"The parameter ${key} is not supported by this factory";
System.Console.WriteLine(msg);
throw new NotSupportedException(msg);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
System.Console.WriteLine("Disposing instance of BasicFactory");
this.Clear();
}
}
}
public class A : Basic
{
public override void SayHello()
{
System.Console.WriteLine("Hello A!");
}
}
public class B : Basic
{
public override void SayHello()
{
System.Console.WriteLine("Hello B!");
}
}
[*「簡單注射器不會隱式跟蹤和處置以暫時生活方式註冊的組件[*](http://simpleinjector.readthedocs.io/en/latest/disposabletransientcomponent.html) – qujck