Castle Windsor - UsingFactoryMethod   zodpovězená otázka

C#

Ahoj, hraju si s Castle Windsor a snažím se pochopit IoC/DI. Hned v úvodu jsem narazil na problém při použití Factory metod. Když spustím kód uvedený níže, dostanu následující výjimku:


Neošetřená výjimka: System.TypeAccessException: Pokus metody Castle.Proxies.Func`1Proxy.Invoke() o přístup k typu IoC_DI_Console.Interfaces.IFactoryTest se nezdařil.

Mohl by někdo poradit, kde dělám chybu. Díky.

class Program
    {
        private static MainAppClass mainAppClass;

        static void Main(string[] args)
        {
            SetupContainer();

            mainAppClass.Start();
        }

        private static void SetupContainer()
        {
            var container = new WindsorContainer();
            container.AddFacility<TypedFactoryFacility>();

            container.Register(Component.For<IFactoryTest>().UsingFactoryMethod(() => { return new FactoryTest(); }));
            container.Register(Component.For<MainAppClass>());

            mainAppClass = container.Resolve<MainAppClass>();
        }

    interface IFactoryTest
    {
        void FromFactoryClass();
    }

    class FactoryTest : IFactoryTest
    {
        public FactoryTest()
        {
            Console.WriteLine($"In FactoryTest ctor {this.GetHashCode()}");
        }

        public void FromFactoryClass()
        {
            Console.WriteLine("Factory");
        }
    }

class MainAppClass
    {
        public Func<IFactoryTest> FactoryTest { get; set; }

        public MainAppClass()
        {
        }

        public void Start()
        {
            FactoryTest().FromFactoryClass();
        }
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Public interface.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha, to mi nějak uniklo :-(. Díky moc.

Ještě bych měl dotaz. Jak se tady pracuje s parametrickým konstruktorem? Při klasickém přístupu, kdy si v jedné třídě vytvářím instance další třídy, napíšu prostě:

 Trida trida = new Trida(string, int, atd...)

Ale podle celé filosofie IoC/DI (pokud jsem dobře četl), by se "new" nemělo používat vůbec. Všechny nové instance si tedy vytvářím v kontejneru buď na začátku nebo za pomoci Factory či Lazy. Jakým způsobem tady můžu použít parametrický konstruktor? Nebo se namísto parametrických konstruktorů používají pro počáteční nastavení třídy pouze property?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

https://github.com/castleproject/Windsor...

pokud používáte DI, new by se vám tam moc objevovat skutečně nemělo. (pozor na overengineering)

Pokud potřebu vaše aplikace nějaké závislosti, je třeba se zamyslet na dtim, jestli konkrétní implementace bude vyžadovat na základě například debugu / testu / releasu měnit implementaci, případně danou věc budete chtít používat na více místech...

výhoda interface + IOC je především to, že máte stanovený contract a implementace je tedy variabilní... můžete tedy kdykoliv nějakou část vaší aplikace vyměnit..

podle SOLIDU by jste ideálně neměl mít nikde ve třídě referenci na konkrétní implementaci, ale pouze na Interface.. todle přináší hodně výhod, kromě toho je to ale skvělá cesta mít vše zbytečně složité, než to být musí.. takže vždy používat mozek ;-)

Obecně... mohu vám říci můj názor, který se mi vždy zatím oplatit.. principy OOP a Solid vám mají pomáhat, nesnažte se je za každou cenu dodržovat, pokud vám mají přidělat práci.

Sám DI/IOC v multi-tier architektuře porušují OOP principy, na druhou stranu plně dodržují SOLID..

Je tedy velké ironie, že SOLID (pravidla pro OOP) jsou skvělým argumentem, proč OOP né- vždy dodržovat, jelikož, pokdu dodržíte vždy OOP, porušíte tím solid :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback