The*_*Sky 17 c# dependency-injection ioc-container inversion-of-control
在阅读了越来越多关于IoC容器的内容后,我读到了这篇文章,关于代码中没有IoC.Resolve()等.
我真的很想知道,我怎么能删除对容器的依赖?
我想写下面的代码:
public void Action()
{
using(IDataContext dc = IoC.Resolve<IDataContext>())
{
IUserRepository repo = IoC.Resolve<IUserRepository>();
// Do stuff with repo...
}
}
Run Code Online (Sandbox Code Playgroud)
但是我如何摆脱IoC.Resolve调用呢?也许我需要更好地理解DI ......
提前致谢.
jri*_*sta 17
一般来说,大多数依赖项可以在创建时注入到类中.但是,在这种特殊情况下,您需要一个必须在使用时按需创建的组件.在这种情况下,很难完全删除对IoC容器的依赖.我的方法一直是创建一个在创建时注入到类中的工厂,这反过来封装了所有直接的IoC使用.这允许你的工厂被嘲笑进行测试,而不是IoC容器本身...这往往更容易:
// In Presentation.csproj
class PresentationController
{
public PresentationController(IDataContextFactory dataContextFactory, IRepositoryFactory repositoryFactory)
{
#region .NET 4 Contract
Contract.Requires(dataContextFactory != null);
Contract.Requires(repositoryFactory != null);
#endregion
_dataContextFactory = dataContextFactory;
_repositoryFactory = repositoryFactory;
}
private readonly IDataContextFactory _dataContextFactory;
private readonly IRepositoryFactory _repositoryFactory;
public void Action()
{
using (IDataContext dc = _dataContextFactory.CreateInstance())
{
var repo = _repositoryFactory.CreateUserRepository();
// do stuff with repo...
}
}
}
// In Factories.API.csproj
interface IDataContextFactory
{
IDataContext CreateInstance();
}
interface IRepositoryFactory
{
IUserRepository CreateUserRepository();
IAddressRepository CreateAddressRepository();
// etc.
}
// In Factories.Impl.csproj
class DataContextFactory: IDataContextFactory
{
public IDataContext CreateInstance()
{
var context = IoC.Resolve<IDataContext>();
// Do any common setup or initialization that may be required on 'context'
return context;
}
}
class RepositoryFactory: IRepositoryFactory
{
public IUserRepository CreateUserRepository()
{
var repo = IoC.Resolve<IUserRepository>();
// Do any common setup or initialization that may be required on 'repo'
return repo;
}
public IAddressRepository CreateAddressRepository()
{
var repo = IoC.Resolve<IAddressRepository>();
// Do any common setup or initialization that may be required on 'repo'
return repo;
}
// etc.
}
Run Code Online (Sandbox Code Playgroud)
这种方法的好处是,虽然您无法完全消除IoC依赖本身,但您可以将其封装在单一类型的对象(工厂)中,从而将大量代码与IoC容器分离.这可以提高您的代码灵活性,例如,从一个IoC容器切换到另一个IoC容器(即Windsor到Ninject).
应该注意的是,一个有趣的结果是,您的工厂通常通过他们使用的相同IoC框架注入其家属.例如,如果您使用Castle Windsor,则会创建配置,告知IoC容器在创建时将两个工厂注入业务组件.业务组件本身也可能有工厂......或者,它可能只是由相同的IoC框架注入更高级别的组件等,ad inf.
| 归档时间: |
|
| 查看次数: |
2341 次 |
| 最近记录: |