簡體   English   中英

IoC容器。 注入容器

[英]IoC Container. Inject container

我想要的是:解析對象A,並且在對象A內,我想使用相同的容器來解析對象C:

public static void Work()
{
    IUnityContainer con = new UnityContainer();
    con.RegisterType<IA, A>();
    con.RegisterType<IB, B>();
    con.RegisterType<IC, C>();

    var a = con.Resolve<IA>();
}


interface IA { }
interface IB { }
interface IC { }

class A : IA
{
    public A(IB b, IUnityContainer con)
    {
        for (int i = 0; i < 10; i++)
        {
            var c = con.Resolve<IC>();
        }
    }
}

class B : IB { };
class C : IC { };

問題:在許多站點上,我看到注入容器不是一個好主意,但是在這種情況下又該如何呢?

編輯1

服務定位器是一種反模式。 因此,如果可以將服務定位器與IoC容器一起使用,為什么還可以呢?

您不應傳遞對類的直接引用,因為這將使您的代碼依賴於使用的IOC容器(在此為UnityContainer),並使單元測試更加困難。

如果您的類A需要多個C實例,則應為此情況定義一個工廠,並將該工廠的實例傳遞給您的類A。您的真實工廠可以引用UnityContainer。 對於單元測試,您可以模擬接口並將模擬的實例傳遞給類A。

這樣的代碼看起來像這樣。

public interface IClassICFactory
{
    IC CreateInstance();
}

public class ClassICUnityContainerFactory : IClassCFactory
{
    private IUnityContainer _container;

    public ClassICUnityContainerFactory(IUnityContainer container)
    {
        _container = container;
    }

    public IC CreateInstance()
    {
        return _container.Resolve<C>();
    }
}

class A : IA
{
    public A(IB b, IClassICFactory factory)
    {
        for (int i = 0; i < 10; i++)
        {
            var c = factory.CreateInstance();
        }
    }
}

從技術上講,它雖然有效,但卻有點“容器化”,並且會導致大量混亂。 我為處理此類問題的容器創建靜態工廠類。 容器解析的類實例應該只關心它們打算做什么,而不是進一步解析其他實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM