依赖注入对于模块间解耦帮助很大。
在类成员上使用[SimpleDI]
标签,使其可被注入。
public interface IFoo
{
}
public class FooA : IFoo
{
}
public class FooB : IFoo
{
}
public class ServiceA
{
[SimpleDI] public IFoo foo {get;}
}
定义规则:
void Start()
{
// 使用FooA实现IFoo
ServiceContainer.Bind<IFoo>().AsSingle(noLazy:true).To<FooA>();
}
支持以下成员:
- 字段、属性
- 静态成员、实例成员
- 只读成员、可读可写成员
如:
class Foo
{
[SimpleDI] static IFoo foo;
[SimpleDI] static IFoo foo { get; }
[SimpleDI] static IFoo foo { get; set; }
[SimpleDI] IFoo foo;
[SimpleDI] IFoo foo { get; }
[SimpleDI] IFoo foo { get; set; }
}
void Init()
{
// 使用FooA实现IFoo,只对ServiceA中的成员生效
ServiceContainer.In<ServiceA>().Bind<IFoo>().AsSingle(noLazy:true).To<FooA>();
}
interface IFoo { }
class Foo : IFoo
{
public Foo(string name, int age)
{
Console.WriteLine($"我的伙伴{name},{age}岁了");
}
}
void Init()
{
// output: 我的伙伴小黑儿,3岁了
ServiceContainer.Bind<IFoo>().AsSingle(noLazy:true).To<Foo>("小黑儿",3);
}
- Single 单例(默认)
- Transient 每次获取都是新实例
// 使用FooA实现IFoo
ServiceContainer.Bind<IManager>().AsSingle().To<FooManager>();
ServiceContainer.Bind<IFoo>().AsTransient().To<Foo>();
对于IManager<IFoo,IBar>
会分别查找IManager,IFoo,IBar,并支持泛型约束。
interface IFoo
{
}
interface IManager
{
}
class Foo : IFoo
{
}
class Manager : IManager
{
}
void Init()
{
ServiceContainer.Get<IManager<IFoo>>(); // returns Manager<Foo>
}