Misbah 的个人资料.NET HITMAN照片日志 工具 帮助

日志


9月8日

Unity - Dependency Injection and Inversion of Control Container

The Dependency Injection Pattern
Dependency injection is a programming technique to reduce component coupling. Dependency injection is also commonly known as “inversion of control” or IoC or sometimes as The Hollywood Principle - "Don’t call us, we’ll call you”. The goal of dependency injection is to separate the concerns of how a dependency is obtained from the core concerns of a boundary. This improves reusability by enabling components to be supplied with dependencies which may vary depending on context.

The Old Way
Following is an example of how you might write code if not using dependency injection

public class WebApp { public WebApp() { quotes = new StockQuotes(); authenticator = new Authenticator(); database = new Database(); logger = new Logger(); errorHandler = new ErrorHandler(); } }

Problem

  • What about the child objects?
  • How does the StockQuotes find the Logger?
  • How does the Authenticator find the database?
  • Suppose you want to use a TestingLogger instead? Or a MockDatabase?

Service Locator pattern attempts to solve some of the problems mentioned above by providing a dictionary of objects. The objects are all stored in this dictionary and the Get method simply returns the object to the caller.

Service Locator Example

public interface ILocator { TObject Get<TObject>(); } public class MyLocator : ILocator { protected Dictionary<Type, object> dict = new Dictionary<Type,object>(); public MyLocator() { dict.Add(typeof(ILogger), new Logger()); dict.Add(typeof(IErrorHandler), new ErrorHandler(this)); dict.Add(typeof(IQuotes), new StockQuotes(this)); dict.Add(typeof(IDatabase), new Database(this)); dict.Add(typeof(IAuthenticator), new Authenticator(this)); dict.Add(typeof(WebApp), new WebApp(this)); } } public class StockQuotes { public StockQuotes(ILocator locator) { errorHandler = locator.Get<IErrorHandler>(); logger = locator.Get<ILogger>(); } }

Pros

  • Classes are decoupled from explicit implementation types
  • Easy to externalize the config

Cons

  • Everyone takes a dependency on the ILocator
  • Hard to store constants and other useful primitives
  • Creation order is still a problem

Dependency Injection Containers
The dependency injection container is a component responsible for assigning dependencies to a recipient component. Containers are generally implemented using the Factory Pattern to allow creation of the recipient and dependency components. Containers are often implemented to allow existing objects to be registered for use as a dependency, or to create new instances when required. Using a dependency injection container with our StockQuotes example provides the following benefits:

  • Gets rid of the dependency on the ILocator
  • Object is no longer responsible for finding its dependencies
  • The container does it for you

In a nutshell, dependency injection just means that a given class or system is no longer responsible for instantiating their own dependencies. In this case “Inversion of Control” refers to moving the responsibility for locating and attaching dependency objects to another class or a DI tool. That might not sound that terribly profound, but it opens the door for a lot of interesting scenarios.
Benefits of Dependency Injection:

  • Dependency Injection is an important pattern for creating classes that are easier to unit test in isolation
  • Promotes loose coupling between classes and subsystems
  • Adds potential flexibility to a codebase for future changes
  • Can enable better code reuse

Unity Application Block
Unity Application Block is a lightweight Inversion of Control container which supports constructor, property and method call injection. Unity sits on top of another framework called ObjectBuilder, but is different from the ObjectBuilder which has been a part of Enterprise Library 3.1 and earlier. Unity is based on v2 of the Objectbuilder and has been optimized for performance quite a bit. Unity is available both as a standalone and part of Enterprise Library 4.0 on codeplex at http://www.codeplex.com/unity and http://www.codeplex.com/entlib. Unity 1.1 is not part of Enterprise Library 4.0 but the good thing about it is that it will update the Unity dlls/libraries in Enterprise Library 4.0 installed folder to 1.1 during installation.

The Unity Application Block includes the following features:

  • It provides a mechanism for building (or assembling) instances of objects, which may contain other dependent object instances.
  • It exposes RegisterType methods that support configuring the container with type mappings and objects (including singleton instances) and Resolve methods that return instances of built objects that can contain any dependent objects.
  • It provides inversion of control (IoC) functionality by allowing injection of preconfigured objects into classes built by the application block. Developers can specify an interface or class type in the constructor (constructor injection), or apply attributes to properties and methods to initiate property injection and method call injection.
  • It supports a hierarchy for containers. A container may have child container(s), allowing object location queries to pass from the child out through the parent container(s).
  • It can read configuration information from standard configuration systems, such as XML files, and use it to configure the container.
  • It makes no demands on the object class definition. There is no requirement to apply attributes to classes (except when using property or method call injection), and there are no limitations on the class declaration.
  • It supports custom container extensions that developers can implement; for example, methods to allow additional object construction and container features such as caching.

Unity has no dependency on Enterprise Library core and can be used without having to install Enterprise Library on the host system. To use Unity in your application you need to add reference to the following dlls in your project
    Microsoft.Practices.ObjectBuilder2
    Microsoft.Practices.Unity

The Unity container can be configured through configuration files or you can use code to register dependencies dynamically at run time. To use Unity with configuration files you need to add reference to the following dll
    Microsoft.Practices.Unity.Configuration

Steps when using Dependency Injection

  • Write your objects the way you want
  • Setup the container
  • Ask the container for objects
  • The container creates objects for you and fulfills dependencies

Setup the container
The ideal place to setup the Unity container for ASP.NET applications is in the Application_Start method of the global.asax file. We would like to have a persistent container that hold it’s state during the execution of the application. The right place to put this is in the Global.asax file as a property of the current application.

We create a simple interface for the container property so that we can access our container using this interface

public interface IContainerAccessor { IUnityContainer Container { get; } }

class in the Global.asax file:

private static UnityContainer _container; public static UnityContainer Container { get { return _container; } set { _container = value; } } protected void Application_Start(object sender, EventArgs e) { BuildContainer(); } protected void Application_End(object sender, EventArgs e) { CleanUp(); } private static void BuildContainer() { IUnityContainer container = new UnityContainer(); //TODO: Register the relevant types for the container here through classes or configuration Container = container; } private static void CleanUp() { if (Container != null) { Container.Dispose(); } }

The BuildContainer method is where we will setup our container and register our types for dependency injection. The RegisterType<TFrom, TTo>() method tells Unity that whenever someone asks for a dependency on TFrom give them Tto. In the example code below the statement container.RegisterType<ILogger, EventLogLogger>() tells Unity that whenever someone has a dependency on type ILogger go ahead and create an object of type EventLogLogger.

There are a couple of different flavors of Dependency Injection

  • Constructor Injection – Attach the dependencies through a constructor function at object creation
  • Setter Injection – Attach the dependencies through setter properties
  • Service Locator – Use a well known class that knows how to retrieve and create dependencies. Not technically DI, but this is what most DI/IoC container tools really do

Constructor Injection

public interface ILogger { void LogEvent(string message); } public class FileLogger : ILogger { public void LogEvent(string message) { ... } } public class EventLogLogger : ILogger { public void LogEvent(string message) { ... } } public class StockQuotes { private Ilogger _logger; public class StockQuotes(ILogger logger) { _logger = logger; } } UnityContainer container = new UnityContainer(); ... contianer.RegisterType<ILogger, EventLogLogger>(); StockQuotes quotes = container.Resolve<StockQuotes>();

If a class that developers instantiate using the Resolve method of the Unity container has a constructor that defines one or more dependencies on other classes, the Unity container will automatically create the dependent object instance specified in parameters of the constructor. In the above example StockQuotes has a dependency on ILogger. When we create an instance of the StockQuotes class using the Resolve method of the Unity container, Unity will automatically create an instance of EventLogLogger and pass it to the constructor of StockQuotes class.

The benefit of using constructor injection is that the constructor function now explicitly declares the dependencies of a class. Constructor injection is often recommended as it eliminates chatty calls to the object and creates a valid object in as few steps as possible.

Setter Injection

public class OracleDatabase : Database { Public void ExecuteQuery(string query) { ... } } public class SqlDatabase : Database { public void ExecuteQuery(string query) { ... } } public class Authenticator { private Database _database; [Dependency] public Database DB { get{return _database;} set{_database = value;} } } UnityContainer container = new UnityContainer(); ... contianer.RegisterType<IDatabase, EventLogLogger>(); Authenticator auth = container.Resolve<Authenticator>();

To force dependency injection of the dependent object, developers must apply the [Dependency] attribute to the property declaration. Many would argue that setter injection is really useful when legacy code needs to be upgraded and provides a smooth transition from legacy code to the new model. Making sure that any new code that depends on undesirable legacy code uses Dependency Injection leaves an easier migration path to eliminate the legacy code later with all new code. 

As a service locator

UnityContainer container = new UnityContainer(); contianer.RegisterType<ILogger, NullLogger>(); … ILogger logger = container.Resolve<ILogger>();

Here we are just telling unity to give us the ILogger interface which is already registered with the container. Using the container in this manner makes it a service locator.

Unity Dependency injection provides a number of ways to configure the container. As described above you use the RegisterType method to inform the container about dependencies. But Unity can also manage the object lifetime e.g.

Dependencies as singleton

UnityContainer container = new UnityContainer(); container.RegisterType<Database, SqlDatabase>(new ContainerControlledLifetimeManager());

The above code  tells Unity that whenever someone asks for type Database give them type SqlDatabase and return the same object every time instead of creating a new one for each dependency.

Named Instance

UnityContainer container = new UnityContainer(); contianer.RegisterType<Database, SqlDatabase>("SQL"); container.RegisterType<Database, OracleDatabase>("Oracle"); IEnumerable<Database> databases = container.ResolveAll<Database>(); Database database = container.Resolve<Database>("SQL");

Named instance allows you to configure Unity with multiple dependencies for the same type but assign them different names. Thi s allows you to do fancy stuff where you want a default type mapping but also want to override the mapping by providing a name during object creation.

Registering an existing object instance
So far all the examples above show how a type can be registered with Unity and the Unity container creates the object for you whenever requested. But what if you already have the object created and want to register this object in Unity.

UnityContainer container = new UnityContainer(); contianer,RegisterInstance<Database>(new SqlDatabase()); contianer.RegisterInstance<Database>("Oracle", new OracleDatabase()); Database database = container.Resolve<Database>(); Database oracleDatabase = container.Resolve<Database>("Oracle");

When using RegisterIntance Unity will automatically make the objects singletons.

Configuring Unity via config file
The Unity container can be configured through configuration files. To use Unity with configuration files you need to add reference to the following dll
    Microsoft.Practices.Unity.Configuration

Use following code to read the container setup from configuration file:

UnityContainer container = new UnityContainer(); UnityConfgurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); Section.Containers.Default.GetConfigCommand().Configure(); ILogger logger = container.Resolve<ILogger>();

.config file:

<configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity> <typeAliases> <!-- Lifetime manager types --> <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" /> <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,Microsoft.Practices.Unity" /> </typeAliases> <containers> <container> <types> <type type="ConsoleApplication1.Database, ConsoleApplication1" mapTo="ConsoleApplication1.SqlDatabase, ConsoleApplication1" lifetime="Singleton" /> <type type="ConsoleApplication1.ILogger, ConsoleApplication1" mapTo="ConsoleApplication1.EvnetLogLogger, ConsoleApplication1" lifetime="Singleton" /> </types> </container> </containers> </unity>

Nested Containers
Unity supports nested containers, which allows the parent container to create child containers. This provides the ability to override parent type mappings with child type mappings. Parent-Child relationship between Unity containers. What this means is that the parent-child relationship between Unity containers will search the child container to the resolve the type mapping, and if not found, will navigate up to the parent container to resolve the type.

UnityContainer parentContainer = new UnityContainer(); IUnityContainer childContainer1 = parentContainer.CreateChildContainer(); IUnityContainer childContainer2 = parentContainer.CreateChildContainer(); parentContainer.RegisterType<ILogger, FileLogger>(new ContainerControlledLifetimeManager()); childContainer1.RegisterType<ILogger, EventLogLogger>(new ContainerControlledLifetimeManager()); ILogger logger = childContainer2.Resolve<ILogger>(); // should return FileLogger from parentContainer ILogger logger2 = childContainer1.Resolve<ILogger>(); //should return EventLogLogger from childContainer1

While registering types with Unity there is a certain risk of introducing unintentional circular references, which are not easy to detect or prevent.
For example, the following code shows two classes that reference each other in their constructors.

public class Class1 { public Class1(Class2 test2) { ... } } public class Class2 { public Class2(Class1 test1) { ... } }

It is the responsibility of the developer to prevent this type of error by ensuring that the members of classes they use with dependency injection do not contain circular references.

References

kick it on DotNetKicks.com

评论 (14)

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

goshop30发表:
http://www.batterygoshop.co.uk/dell/e1505.htm dell e1505 battery
http://www.batterygoshop.co.uk/dell/kd476.htm dell kd476 battery
http://www.batterygoshop.co.uk/dell/gd761.htm dell gd761 battery
http://www.batterygoshop.co.uk/dell/latitude-d820.htm dell latitude d820 battery
http://www.batterygoshop.co.uk/dell/inspiron-1520.htm dell inspiron 1520 battery
http://www.batterygoshop.co.uk/dell/inspiron-1720.htm dell inspiron 1720 battery
http://www.batterygoshop.co.uk/dell/vostro-1500.htm dell vostro 1500 battery
http://www.batterygoshop.co.uk/dell/vostro-1700.htm dell vostro 1700 battery
http://www.batterygoshop.co.uk/gateway/8msb.htm gateway 8msb battery
http://www.batterygoshop.com/sony/pcga-bp2v.htm sony pcga-bp2v battery
http://www.batterygoshop.com/sony/pcga-bp2nx.htm sony pcga-bp2nx battery
http://www.batterygoshop.co.uk/gateway/8msbg.htm gateway 8msbg battery
http://www.batterygoshop.co.uk/gateway/m680.htm gateway m680 battery
http://www.batterygoshop.co.uk/gateway/m360.htm gateway m360 battery
http://www.batterygoshop.co.uk/gateway/m460.htm gateway m460 battery
http://www.batterygoshop.co.uk/sony/vgp-bps5.htm sony vgp-bps5 battery
http://www.batterygoshop.co.uk/hp/hstnn-db02.htm hp hstnn-db02 battery
http://www.batterygoshop.co.uk/hp/r3000.htm hp r3000 battery
http://www.batterygoshop.co.uk/dell/inspiron-6000.htm dell inspiron 6000 battery
http://www.batterygoshop.co.uk/acer/batbl50l6.htm acer batbl50l6 battery
http://www.batterygoshop.co.uk/dell/d5318.htm dell d5318 battery
http://www.batterygoshop.co.uk/dell/inspiron-9300.htm dell inspiron 9300 battery
http://www.batterygoshop.co.uk/dell/inspiron-9400.htm dell inspiron 9400 battery
http://www.batterygoshop.co.uk/hp/dv6000.htm hp dv6000 battery
http://www.batterygoshop.co.uk/hp/v3000.htm hp v3000 battery
http://www.batterygoshop.co.uk/hp/v6000.htm hp v6000 battery
http://www.batterygoshop.co.uk/hp/510.htm hp 510 battery
http://www.batterygoshop.co.uk/hp/530.htm hp 530 battery
http://www.batterygoshop.co.uk/dell/inspiron-1300.htm dell inspiron 1300 battery
http://www.batterygoshop.co.uk/dell/inspiron-b120.htm dell inspiron b120 battery
http://www.batterygoshop.co.uk/dell/inspiron-b130.htm dell inspiron b130 battery
http://www.batterygoshop.co.uk/dell/inspiron-1525.htm dell inspiron 1525 battery
http://www.batterygoshop.co.uk/hp/dv2000.htm hp dv2000 battery
http://www.batterygoshop.co.uk/dell/d9200.htm
http://www.batterygoshop.co.uk/acer/tm4200.htm
http://www.batterygoshop.co.uk/toshiba/pa3399u-1bas.htm toshiba pa3399u-1bas battery
http://www.batterygoshop.co.uk/toshiba/satellite-a100.htm toshiba satellite a100 battery
http://www.batterygoshop.co.uk/hp/dv8000.htm hp dv8000 battery
http://www.batterygoshop.co.uk/sony/vgp-bps3.htm sony vgp-bps3 battery
http://www.batterygoshop.co.uk/dell/inspiron-500m-series.htm dell inspiron 500m series battery
http://www.batterygoshop.co.uk/acer/lcbtp03003.htm acer lcbtp03003 battery
http://www.batterygoshop.co.uk/acer/btp-550.htm acer btp-550 battery
http://www.batterygoshop.co.uk/acer/btp-550p.htm acer btp-550p battery
http://www.batterygoshop.co.uk/compaq/n600c.htm compaq n600c battery
3 小时以前
没有名字发表:
http://www.batteryfast.com.au/hp/dv2100.htm hp dv2100 battery
http://www.batteryfast.com.au/hp/dv2200.htm hp dv2200 battery
http://www.batteryfast.com.au/hp/v3000.htm hp v3000 battery
http://www.batteryfast.com.au/hp/dv2100.htm hp dv2100 battery
http://www.batteryfast.com.au/hp/dv2200.htm hp dv2200 battery
http://www.batteryfast.com.au/dell/inspiron-1720.htm dell inspiron 1720 battery
http://www.batteryfast.com.au/dell/latitude-d830.htm dell latitude d830 battery
http://www.batteryfast.com.au/dell/latitude-d531.htm dell latitude d531 battery
http://www.batteryfast.com.au/dell/d9200.php Notebook Laptop Battery for Dell D9200 D5318 G5260 laptop battery ,
http://www.batteryfast.com.au/dell/inspiron-1200.htm dell inspiron 1200 battery
http://www.batteryfast.com.au/toshiba/satellite-p200.htm toshiba satellite p200 battery
http://www.batteryfast.com.au/toshiba/satellite-p205.htm toshiba satellite p205 battery
http://www.batteryfast.com.au/toshiba/pa3534u-1brs.htm toshiba pa3534u-1brs battery
http://www.batteryfast.com.au/toshiba/satellite-a205.htm toshiba satellite a205 battery
http://www.batteryfast.com.au/toshiba/satellite-a100.htm toshiba satellite a100 battery
http://www.batteryfast.com.au/toshiba/satellite-a105.htm toshiba satellite a105 battery
http://www.batteryfast.com.au/toshiba/satellite-a80.htm toshiba satellite a80 battery
http://www.batteryfast.com.au/toshiba/satellite-m110.htm toshiba satellite m110 battery
http://www.batteryfast.com.au/acer/travelmate-4200.htm acer travelmate 4200 battery ,
http://www.batteryfast.com.au/dell/inspiron-1100-series.htm dell inspiron 1100 series battery ,
http://www.batteryfast.com.au/compaq/nc4200.htm compaq nc4200 battery
http://www.batteryfast.com.au/asus/al23-901.htm asus al23-901 battery
http://www.batteryfast.com.au/dell/312-0584.htm dell 312-0584 battery
http://www.batteryfast.com.au/dell/312-0543.htm dell 312-0543 battery
http://www.batteryfast.com.au/dell/312-0585.htm dell 312-0585 battery
http://www.batteryfast.com.au/hp/b2800.htm hp b2800 battery
http://www.batteryfast.com.au/hp/a32.htm hp a32 battery
http://www.batteryfast.com.au/hp/m9.htm hp m9 battery
http://www.batteryfast.com.au/toshiba/pa3331u-1brs.htm toshiba pa3331u-1brs battery
http://www.batteryfast.com.au/toshiba/satellite-m30.htm toshiba satellite m30 battery
6 小时以前
没有名字发表:
http://www.batterylaptoppower.com/compaq/hstnnib12.htm compaq hstnnib12 battery
http://www.batterylaptoppower.com/compaq/tc4400.htm compaq tc4400 battery
http://www.batterylaptoppower.com/compaq/383510-001.htm compaq 383510-001 battery
http://www.batterylaptoppower.com/dell/latitude-d810.htm dell latitude d810 battery
http://www.batterylaptoppower.com/dell/precision-m70.htm dell precision m70 battery
http://www.batterylaptoppower.com/dell/y4367.htm dell y4367 battery
http://www.batterylaptoppower.com/dell/g5260.htm dell g5260 battery
http://www.batterylaptoppower.com/dell/0xr693.htm dell 0xr693 battery
http://www.batterylaptoppower.com/dell/hp297.htm dell hp297 battery
http://www.batterylaptoppower.com/dell/xr693.htm dell xr693 battery
http://www.batterylaptoppower.com/dell/1210.htm dell 1210 battery
http://www.batterylaptoppower.com/dell/cg036.htm dell cg036 battery
http://www.batterylaptoppower.com/dell/d044h.htm dell d044h battery
http://www.batterylaptoppower.com/dell/312-0831.htm dell 312-0831 battery
http://www.batterylaptoppower.com/dell/xd187.htm dell xd187 battery
http://www.batterylaptoppower.com/hp/dv8200.htm hp dv8200 battery
http://www.batterylaptoppower.com/hp/dv8300.htm hp dv8300 battery
http://www.batterylaptoppower.com/hp/hstnn-db20.htm hp hstnn-db20 battery
http://www.batterylaptoppower.com/hp/dp399a.htm hp dp399a battery
http://www.batterylaptoppower.com/hp/ze2000.htm hp ze2000 battery
http://www.batterylaptoppower.com/hp/presario-x1200.htm hp presario x1200 battery
http://www.batterylaptoppower.com/hp/presario-x1400.htm hp presario x1400 battery
http://www.batterylaptoppower.com/acer/batecq60.htm acer batecq60 battery
http://www.batterylaptoppower.com/acer/4ur18650f-2-cpl-cq60.htm acer 4ur18650f-2-cpl-cq60 battery
http://www.batterylaptoppower.com/acer/btp-39d1.htm acer btp-39d1 battery
http://www.batterylaptoppower.com/acer/btp-620.htm acer btp-620 battery
http://www.batterylaptoppower.com/acer/travelmate-620.htm acer travelmate 620 battery
http://www.batterylaptoppower.com/acer/travelmate-630.htm acer travelmate 630 battery
http://www.batterylaptoppower.com/acer/btp-43d1.htm acer btp-43d1 battery
http://www.batterylaptoppower.com/acer/travelmate-220.htm acer travelmate 220 battery
http://www.batterylaptoppower.com/acer/travelmate-280.htm acer travelmate 280 battery
http://www.batterylaptoppower.com/hp/dv9600.htm hp dv9600 battery
http://www.batterylaptoppower.com/acer/lcbtp03003.htm acer lcbtp03003 battery
http://www.batterylaptoppower.com/compaq/nx9020.htm compaq nx9020 battery
http://www.batterylaptoppower.com/toshiba/pa3689u-1bas.htm toshiba pa3689u-1bas battery
http://www.batterylaptoppower.com/toshiba/pabas155.htm toshiba pabas155 battery
http://www.batterylaptoppower.com/toshiba/nb100.htm toshiba nb100 battery
http://www.batterylaptoppower.com/toshiba/satellite-p205.htm toshiba satellite p205 battery
http://www.batterylaptoppower.com/toshiba/satellite-a80.htm toshiba satellite a80 battery
http://www.batterylaptoppower.com/acer/um08a71.htm acer um08a71 battery
http://www.batterylaptoppower.com/acer/um08a72.htm acer um08a72 battery
http://www.batterylaptoppower.com/dell/m1530.htm dell m1530 battery
http://www.batterylaptoppower.com/dell/ru006.htm dell ru006 battery
http://www.batterylaptoppower.com/dell/7k330.htm dell 7k330 battery
http://www.batterylaptoppower.com/uniwill/n251c2.htm uniwill n251c2 battery
6 小时以前
没有名字发表:
http://www.batteryfast.com.au/hp/dv6500.htm hp dv6500 battery
http://www.batteryfast.com.au/ibm/thinkpad-t42.htm ibm thinkpad t42 battery
http://www.batteryfast.com.au/toshiba/te2000-grey.htm toshiba te2000 grey battery
http://www.batteryfast.com.au/acer/black-aspire-one-a150x-series.htm acer black aspire one a150x series battery
http://www.batteryfast.com.au/acer/black-aspire-one-zg5.htm acer black aspire one zg5 battery
http://www.batteryfast.com.au/acer/blue-aspire-one-a150x-series.htm acer blue aspire one a150x series battery
http://www.batteryfast.com.au/acer/blue-aspire-one-zg5.htm acer blue aspire one zg5 battery
http://www.batteryfast.com.au/toshiba/pa3366u-1brs.htm toshiba pa3366u-1brs battery
http://www.batteryfast.com.au/toshiba/satellite-a30-921.htm toshiba satellite a30-921 battery
http://www.batteryfast.com.au/acer/blue-aspire-one-a110l-series.htm acer blue aspire one a110l series battery
http://www.batteryfast.com.au/acer/blue-aspire-one-a150l-series.htm acer blue aspire one a150l series battery
http://www.batteryfast.com.au/toshiba/ba1405.htm toshiba ba1405 battery
http://www.batteryfast.com.au/compaq/n600.htm compaq n600 battery
http://www.batteryfast.com.au/compaq/n600c.htm compaq n600c battery
http://www.batteryfast.com.au/compaq/n610c.htm compaq n610c battery
http://www.batteryfast.com.au/compaq/n610v.htm compaq n610v battery
http://www.batteryfast.com.au/compaq/n620c.htm compaq n620c battery
http://www.batteryfast.com.au/asus/m6000.htm asus m6000 battery
http://www.batteryfast.com.au/asus/a42-w1.htm asus a42-w1 battery
http://www.batteryfast.com.au/asus/w1.htm asus w1 battery
http://www.batteryfast.com.au/asus/w1g.htm asus w1g battery
http://www.batteryfast.com.au/asus/w1v.htm asus w1v battery
http://www.batteryfast.com.au/asus/w1000.htm asus w1000 battery
http://www.batteryfast.com.au/asus/w1000n.htm asus w1000n battery
http://www.batteryfast.com.au/asus/w1000g.htm asus w1000g battery
http://www.batteryfast.com.au/asus/w1000-silver.htm asus w1000 silver battery
http://www.batteryfast.com.au/asus/w1-silver.htm asus w1 silver battery
http://www.batteryfast.com.au/dell/latitude-d810.htm dell latitude d810 battery
http://www.batteryfast.com.au/dell/precision-m70.htm dell precision m70 battery
http://www.batteryfast.com.au/dell/y4367.htm dell y4367 battery
http://www.batteryfast.com.au/dell/e1405.htm dell e1405 battery
http://www.batteryfast.com.au/dell/inspiron-630m.htm dell inspiron 630m battery
http://www.batteryfast.com.au/acer/btp-43d1.htm acer btp-43d1 battery
http://www.batteryfast.com.au/acer/travelmate-4200.htm acer travelmate 4200 battery
http://www.batteryfast.com.au/asus/90-naa1b1000.htm asus 90-naa1b1000 battery
http://www.batteryfast.com.au/asus/a42-v6.htm asus a42-v6 battery
http://www.batteryfast.com.au/hp/dv9200.htm hp dv9200 battery
http://www.batteryfast.com.au/hp/dv9100.htm hp dv9100 battery
http://www.batteryfast.com.au/hp/dv9700.htm hp dv9700 battery
http://www.batteryfast.com.au/hp/v1000.htm hp v1000 battery
http://www.batteryfast.com.au/toshiba/satellite-m100.htm toshiba satellite m100 battery
http://www.batteryfast.com.au/toshiba/pabas067.htm toshiba pabas067 battery
http://www.batteryfast.com.au/toshiba/pa3536u.htm toshiba pa3536u battery
http://www.batteryfast.com.au/toshiba/satellite-x200.htm toshiba satellite x200 battery
http://www.batteryfast.com.au/dell/inspiron-1300.htm dell inspiron 1300 battery
6 小时以前
2 天以前
2 天以前
2 天以前
David发表:
Very nice article, it helped me wrap my head around how dependency injection works. Thanks
11 月 12 日
11 月 11 日
没有名字发表:
Hi,

Great blog with interesting informations.
I can use it t solve my problem.

Thanx
M.
http://www.vanjobb.hu/
5 月 15 日
kennecarl发表:
nice post, learned alot!
2 月 3 日
SimonsJeff发表:
Excellent article explaining DI, concise and with examples!
1 月 20 日
匿名 的图片
azimyasin 发表:
Awesome stuff Worth trying !
9 月 15 日
Its really good and new thing for me
9 月 10 日

引用通告

此日志的引用通告 URL 是:
http://dotnethitman.spaces.live.com/blog/cns!E149A8B1E1C25B14!267.trak
引用此项的网络日志