2009-03-27 24 views
5

Tôi có IRepository < T> và triển khai SqlRepository < T>. SqlRepository có tham số DataContext trong hàm tạo.Tiêm đối tượng khác nhau vào hàm tạo với StructureMap cho trường hợp nhất định

cấu hình SM trông như thế này:

x.ForRequestedType(typeof(IRepository<>)) 
.TheDefaultIsConcreteType(typeof(SqlRepository<>)); 

x.ForRequestedType<DataContext>().CacheBy(InstanceScope.Hybrid) 
.TheDefault.Is.ConstructedBy(()=>{ 
         var dc = new FirstDataContext(); 
         dc.Log = new DebuggerWriter(); 
         return dc; 
        }); 

Nhưng đối với xây dựng IRepository < SpecificObject> tôi muốn tiêm DataContext khác nhau. Làm thế nào để nói SM rằng khi tôi yêu cầu IReposiotry < SpecificObject> Tôi muốn DataContext khác nhau, không FirstDataContext nhưng SecondDataContext (mà DC đi đến cơ sở dữ liệu khác nhau).

Ví dụ, khi tôi yêu cầu IRepository < T> Tôi muốn FirstDataContext được tiêm, nhưng khi tôi yêu cầu explicity cho IRepository < Sản phẩm> Tôi muốn SecondDataContext được tiêm.

Ngoài ra, SecondDC đó nên được Hybrid lưu trữ bởi SM!

Trả lời

4

Cái gì đó như ...

ForRequestedType<DataContext>() 
    .CacheBy(InstanceScope.Hybrid) 
    .AddInstances(inst => inst.ConstructedBy(() => 
     new SecondDataContext { Log = new DebuggerWriter() }) 
     .WithName("secondDataContext")) 
    .TheDefault.Is 
    .ConstructedBy(() => new FirstDataContext {Log = new DebuggerWriter()}); 

ForRequestedType<IRepository<SpecificObject>>() 
    .TheDefault.Is 
    .OfConcreteType<SqlRepository<SpecificObject>>() 
    .CtorDependency<DataContext>() 
    .Is(inst => inst.TheInstanceNamed("secondDataContext")); 
+0

nó đã hoạt động! Tuyệt vời, thanx rất nhiều! –

1

Đó thực sự giúp tôi quá. Có một lớp bê tông được sử dụng trong một hàm tạo để lần lượt nhận được một chuỗi kết nối khác nhau trong hàm tạo của nó phụ thuộc vào lớp "cha mẹ" nào đang sử dụng nó. Cảm ơn.

  ObjectFactory.Initialize(x=> 
            { 
             // Different connection string for each usage 
             // of the RelationalGateway class 
             x.ForRequestedType<RelationalGateway>() 
              .AddInstances(r => 
               r.ConstructedBy(() => 
                new RelationalGateway(ConfigRepository.DataSourceName)) 
              .WithName("config")) 
              .TheDefault.Is.ConstructedBy(
              () => new RelationalGateway(OracleSpatialRepository.DataSourceName)); 

             // Inject the right RelationalGateway 
             x.ForRequestedType<IConfigRepository>() 
              .TheDefault.Is.OfConcreteType<ConfigRepository>() 
              .CtorDependency<RelationalGateway>().Is(inst => 
               inst.TheInstanceNamed("config")); 

             x.ForRequestedType<ISpatialRepository>() 
              .TheDefault.Is.OfConcreteType<OracleSpatialRepository>() 
              .CtorDependency<RelationalGateway>().IsTheDefault(); 

             // Other simple types 
             x.ForRequestedType<IIdGenerator>().TheDefaultIsConcreteType<IdGenerator>(); 
            }); 
Các vấn đề liên quan