Skip to main content

Autofac 2.3

De cateva zile s-a lansat o noua versiune de Autofac( v. 2.3). Am dat jos ultima versiune si am inceput sa ma joc cu acesta si iata ce am descoperit:
Ce ne ofera Autofac:
  • dependency injection;
  • inversion of control( IoC);
  • suportat de diferite platforme( ASP.NET MVC, Silverlight, etc);
Nu este atat de complex precum Windsor de la Castle Project, dar ofera functiile de baza de care am avea nevoie pentru un proiect de dimensiuni mici.
Iata cum se foloseste:
Clasa de baza prin care putem sa inregistram sau sa obtinem instance este "ContainerBuilder"
var autofac=new ContainerBuilder();
Pentru a inregistra putem folosi de metoda "Register".
autofac.Register(component=> new NumeClasa());
Pentru a obtine o componenta din container trebuie apelata metoda "Resolve":
autofac.Resolve<NumeClasa>();
In cazul in care constructorul clasei noastre are nevoie de anumiți parametrii care au fost deja înregistrați putem sa apelam metoda "Resolve" in momentul in care înregistram componenta:
autofac.Register(component=> new NumeClasa(componenta.Resolve<ClasaInregistrata>()));
Sunt cazuri cand dorim sa inregistram o componenta ca si un serviciu cu un tip diferit fata de componenta pe care vrem sa o adaugam. In acest caz metoda "As" ne vine in ajutor:
autofac.Register(component => new NumeClasa()).As<INumeClasa>();
Sunt momente cand vrem o modalitatea in care sa controlam momentul in care se face dispose pe componenta pe care am inregistrat-o. Autofac ne vine in ajutor.
autofac.Register(component => new NumeClasa()).ExternallOwned();
Dar in acest caz trebuie sa implementam interfata "IDisposable" si sa o apelam noi explicit cand este nevoie de metoda "Dispose".
In mod normal, durata de viata a unei componente este egala cu durata de viata a aplicatiei, dar putem seta ca aceasta sa existe: pe thread, pe apel HTTP sau la fiecare apel sa se creeze o noua instanta a componentei.
Pentru a avea o singura instanta in toata aplicatia trebuie sa facem in felul urmator:
autofac.Register(component => new NumeClasa()).SingleInstance();
Pentru a avea instante diferite trebuie sa apelam metoda "InstancePerLifetimeScope" in loc de "SingleInstance". Prin intermediul ei putem sa obtinem instanțe unice pe thread sau pe request.
De exemplu ca sa avem o instanta unica pe thread putem sa facem urmatorul lucru:
var container=new ContainerBuilder();
autofac.Register(component => new NumeClasa())
......
//iar in interiorul la threadul nou
using(var perThread = container.BeginLifetimeScope())
{
....
//Instanta unica pe thread.
var numeClasa = perThread.Resolve<NumeClasa>();
}
Cam complicat, nu? Puteau sa ascunda acest mecanism, iar la apelul metodei resolve sa obtinem direct o instanta unica pe thread.
Toate configuratiile se pot face si in fisierul de configurare, care sunt extrem de asemanatoare cu cele folosite de Windsor.
Concluzie: Este o solutie simpla si foarte usor de folosit, dar putem avea probleme daca dorim sa facem lucruri mai complexe, Dupa cum s-a putut observa, Autofac este destul de rudimental, nu neaparat din lipsa de functionalitati, dar are un API destul de restrans, iar unele lucruri trebuie sa le definim de fiecare data sau sa ne definim un set de extension methods.

Comments

Popular posts from this blog

Windows Docker Containers can make WIN32 API calls, use COM and ASP.NET WebForms

After the last post , I received two interesting questions related to Docker and Windows. People were interested if we do Win32 API calls from a Docker container and if there is support for COM. WIN32 Support To test calls to WIN32 API, let’s try to populate SYSTEM_INFO class. [StructLayout(LayoutKind.Sequential)] public struct SYSTEM_INFO { public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; } ... [DllImport("kernel32")] static extern void GetSystemInfo(ref SYSTEM_INFO pSI); ... SYSTEM_INFO pSI = new SYSTEM_INFO(

Azure AD and AWS Cognito side-by-side

In the last few weeks, I was involved in multiple opportunities on Microsoft Azure and Amazon, where we had to analyse AWS Cognito, Azure AD and other solutions that are available on the market. I decided to consolidate in one post all features and differences that I identified for both of them that we should need to take into account. Take into account that Azure AD is an identity and access management services well integrated with Microsoft stack. In comparison, AWS Cognito is just a user sign-up, sign-in and access control and nothing more. The focus is not on the main features, is more on small things that can make a difference when you want to decide where we want to store and manage our users.  This information might be useful in the future when we need to decide where we want to keep and manage our users.  Feature Azure AD (B2C, B2C) AWS Cognito Access token lifetime Default 1h – the value is configurable 1h – cannot be modified

What to do when you hit the throughput limits of Azure Storage (Blobs)

In this post we will talk about how we can detect when we hit a throughput limit of Azure Storage and what we can do in that moment. Context If we take a look on Scalability Targets of Azure Storage ( https://azure.microsoft.com/en-us/documentation/articles/storage-scalability-targets/ ) we will observe that the limits are prety high. But, based on our business logic we can end up at this limits. If you create a system that is hitted by a high number of device, you can hit easily the total number of requests rate that can be done on a Storage Account. This limits on Azure is 20.000 IOPS (entities or messages per second) where (and this is very important) the size of the request is 1KB. Normally, if you make a load tests where 20.000 clients will hit different blobs storages from the same Azure Storage Account, this limits can be reached. How we can detect this problem? From client, we can detect that this limits was reached based on the HTTP error code that is returned by HTTP