Unity имеет DependencyAttribute
, который вы можете использовать для этого:
public class MyObject
{
private SomeOtherObject _dependentObject;
[Dependency]
public SomeOtherObject DependentObject
{
get { return _dependentObject; }
set { _dependentObject = value; }
}
}
http://msdn.microsoft.com/en-us/library/ff650198.aspx
Исходя из вашего вопроса, может показаться, что вы пытаетесь использовать Unity не в том месте, а ваш дизайнерский смысл говорил вам, что это не правильно. Вы должны видеть только Unity, где вы загружаете свое приложение. Это ваш метод Main в консольном приложении или Global.asax в веб-приложении или приложении wcf. Идея состоит в том, чтобы продолжать полагаться на зависимости по всей цепочке до тех пор, пока вы не доберетесь до того места, где вы загрузитесь, и решите только этот один объект верхнего уровня, используя ваш контейнер IoC. В консольном приложении я делаю это:
class Program
{
static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container
.AddExtension(new ConfigureForConsole(args))
.Resolve<MyApplication>()
.Execute();
}
}
}
http://www.agileatwork.com/console-application-with-ioc/
В этом случае MyApplication
- мой объект верхнего уровня (здесь не обязательно должен быть интерфейс). ConfigureForConsole
- это одноразовое расширение контейнера, содержащее все строки RegisterType
. В качестве альтернативы вы можете инициализировать контейнер из App.Config здесь. Идея в том, что ваш метод Main почти ничего не содержит. Еще одним преимуществом этого подхода является то, что он делает ваш код более переносимым. Я считаю, что консольные приложения обычно превращаются в службы Windows, и поддержание чистоты делает этот переход довольно безболезненным.