ioc - unity container c#
Usando Unity DI con una aplicaciĆ³n de consola (1)
Unity solo proporciona dependencias para los componentes obtenidos a través de Resolve
o mientras se resuelven las subdependencias. El componente o componentes "raíz" se deben obtener del contenedor manualmente.
El uso de un new Program
no proporcionaría automáticamente las dependencias porque evita el contenedor de Unity.
static class ProgramEntry
{
static void Main(string[] args)
{
var unity = CreateUnityContainerAndRegisterComponents();
// Explicitly Resolve the "root" component or components
var program = unity.Resolve<Program>();
program.Run();
}
}
public class Program
{
readonly Ix _x;
// These dependencies will be automatically resolved
// (and in this case supplied to the constructor)
public Program(IMapper mapper, Ix x)
{
// Use dependencies
mapper.RegisterMappings();
// Assign any relevant properties, etc.
_x = x;
}
// Do actual work here
public void Run() {
_x.DoStuff();
}
}
Prefiero el registro basado en código para la mayoría de las tareas.
Recomiendo no usar atributos, aunque ''funcionarán'' si siguen el patrón
Resolve
anterior. Los objetos "raíz" deben resolverse manualmente.El problema con los atributos es que estos agregan dependencias en Unity, ¡tanto para "invertir"!
La inyección del constructor (como se muestra) es automática / predeterminada . Consulte Inyección de elemento / propiedad en Unity sin atributos si se prefiere Inyección de propiedad.
Probablemente resolvería una Fábrica (o
Func<UoW>
) para crear una UoW y suministrarla en el contexto de la pila de llamadas (es decir, pasarlo a métodos) cuando corresponda. La aplicación puede tener muchas UoW diferentes durante una sola ejecución. En este caso, también podría estar interesado en crear ámbitos.Probablemente también usaría una fábrica para crear un objeto IMapper preconfigurado cuando se resuelva en lugar de utilizar luego RegisterMappings.
Estoy tratando de hacer que Unity funcione con mi aplicación de consola, sin embargo ... todas las propiedades que intento que la dependencia inyecte siguen siendo nulas.
Este es mi código:
Program.cs
namespace .Presentation.Console
{
class Program
{
static void Main(string[] args)
{
var mainThread = new MainThread();
}
}
}
MainThread.cs
namespace xxxx.Presentation.Console
{
public class MainThread
{
public IUnitOfWork UnitOfWork { get; set; }
public IMapper Mapper { get; set; }
public MainThread()
{
Mapper.RegisterMappings();
}
}
}
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IDataAccess" type="UnityFramework.IDataAccess, UnityFramework" />
<namespace name="UnityFramework" />
<assembly name="UnityFramework" />
<container>
<types>
<type type="IMapper" mapTo="xxxx.Core.Parse.ParseMapper" />
</types>
</container>
</unity>
</configuration>
App.config está configurado para copiar siempre
Donde Mapper se devuelve como nulo en este caso (y supongo que UnitOfWork también)
¿Debo hacer algo más? Agrega algo a la aplicación.config? ¿Me estoy perdiendo de algo?
¡Gracias por adelantado!
Br, Inx