我只想用属性[DoInjection]标记一个属性,并统一进行注入。我不想使用prop = Unity.Resolve(type)。那是痛苦和混乱。团结是否提供了做到这一点的属性,还是我必须建立自己的属性?
编辑:在App.Main中注册
ISessionFactory sf = new SessionFactory();
container.RegisterType<IRepository, CustomerRepository>(new InjectionConstructor(sf.CurrentUoW));
container.RegisterInstance<IUnitOfWork>(sf.CurrentUoW);
在ClassX其他类中的IUnitOfWork属性上使用[Dependency],但它始终为null。我是否需要使用Unity来构建ClassX实例才能使其正常工作?看来我必须这么做。我不喜欢
最佳答案
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方法,或者Web或wcf应用程序中的Global.asax。这个想法是一直依赖于整个链上的依赖项,直到到达使用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服务,并且在此处保持整洁,这使过渡非常轻松。关于c# - unity-没有resolve()的解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5654050/